24-IO流-69-IO流(联通问题)

来源:互联网 发布:数据迁移服务 编辑:程序博客网 时间:2024/05/16 17:31
/* * 打开API,点开java.io包,点进RandomAccessFile类,找到writeUTF()方法,点击modified UTF-8,可以看到UTF-8修改版的 * 编码形式。 *  * UTF-8这么编码的原因: * 比如现在硬盘内有如下数据:1100-0100 1001-1010 0111-1111 1110-0101 1001-1011 1001-0000 * 流去读取该数据,一次读8位(1个字节),先读取到110,判断该数据是2个字节存储的,那么读完1100-0100 1001-1010去查表; * 再继续读,读到0,判断该数据是1个字节存储的,读完0111-1111去查表;再往下读,读到1110,判断该数据是3个字节存储的,读 * 完1110-0101 1001-1011 1001-0000去查表。(注,若3字节存储,就是8×3=24位,前8位1110打头,中间8位10打头,后8位10打头) *//** * 【联通问题】 * 在当前目录下新建1.txt和2.txt,在1.txt中输入“移动”并保存关闭,在2.txt中输入“联通”并保存关闭,再重新打开这俩文件, * 发现1.txt中能成功显示“移动”,2.txt中不能成功显示“联通”,显示的是乱码。 *  * 【原因】 * 在1.txt内点击文件→另存为,发现解码所用码表是ANSI(即本地码表),在2.txt内点击文件→另存为,发现解码所用码表是UTF-8, * 所以当在1.txt中输入移动时,编码与解码均用本地码表,而在2.txt输入联通时,编码用的本地码表,解码是UTF-8,所以出现乱码。 *  * 向txt文件输入文字即编码过程,打开txt文件查看即解码过程。 * (这是记事本的一个小bug) */package demo;import java.io.UnsupportedEncodingException;public class Demo {public static void main(String[] args) throws UnsupportedEncodingException {String str = "联通";byte[] buf = str.getBytes("GBK");for(byte b : buf){//System.out.print(b+" ");//输出:-63 -86 -51 -88 System.out.println(Integer.toBinaryString(b & 255));//原来b是十进制形式,转为二进制,与255是只取最后8位,因为前面全是1/* * 11000001 * 10101010 * 11001101 * 10101000 * 这就是“联通”用GBK编码后,对应的二进制表示形式,8位=1字节,2字节=1汉字,前16位是“联”,后16位是“通”。  *//** * 由此可见,对于表示“联”的16位二进制,前8位以110打头,后8位10打头,正好符合了UTF-8的编码规范(UTF-8编码规则见API), * 同理“通”也正好符合UTF-8编码规范。 *  * 即“联通”的GBK编码正好吻合上UTF-8的编码规则,所以记事本在解析时,误以为是UTF-8编的码,从而出现乱码。 */}}}

0 0
原创粉丝点击