用winhex等工具软件查看记事本中几种编码方式不同.
1. 新建一个文本文档输入“联通”,再次打开 Winhex查看:
这里先要了解Unicode与UTF-8的关系:UTF-8是由Unicode变化而来 X为低八位 Y高八位 Unicode编码 | | | | | | | | | | 00000000 10000000到 00000111 11111111 | | | | 00001000 00000000到 11111111 11111111 | 1110YYYY 10YYYYXX 10XXXXXX | | | 00000001 00000000 00000000到00011111 11111111 11111111 | 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX |
记事本输入“联通”用的是本地字符集GBK 分析: UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx 在保存这个操作中,windows默认保存的编码是ANSI(实际上应该是GBK)。 第一二个字节、第三四个字节的起始部分的都是"110"和"10",正好与UTF8规则里的两字节模板是一致的,于是再次打开记事本时,记事本就误认为这是一个UTF8编码的文件,让我们把第一个字节的110和第二个字节的10去掉,我们就得到了"00001 101010",再把各位对齐,补上前导的0,就得到了"0000 0000 0110 1010",不好意思,这是UNICODE的006A,也就是小写的字母"j",而之后的两字节用UTF8解码之后是0368,这个字符什么也不是。这就是只有"联通"两个字的文件没有办法在记事本里正常显示的原因。 可以认为,当文档中的所有字符的二进制编码在C0≤AA(第一个字节)≤DF 80≤BB(第二个字节)≤BF时,记事本都无法确认文本的编码格式,就按照UTF-8的格式来显示。 另外,当我们在记事本编写"联通",然后另存为,选择UTF-8的格式,保存。再重新打开的时候,就不会有乱码。用UltraEdit的十六进制打开可以看到 EF BB BF E8 81 94 E9 80 9A。其中 EF BB BF 是UTF-8编码格式的标记。当用记事本打开文件时,读到EF BB BF 时,就确定这是UTF-8编码格式的字符。所以打开时不会看到乱码。同理与Unicode、UTF-16。 Unicode的"联通"的十六进制编码:FF FE 54 80 1A 90 。其中FF FE 是Unicode的标记。 UTF-16的"联通"的十六进制编码为:FE FF 80 54 90 1A。这里的FE FF是UTF-16的标记。 ANSI(GBK): 移动 记事本检测文件头,UTF-8 按本地字符集解码。 联通 上述已解释 出现乱码。误检测为UTF-8编码 不是Unicode,Unicode big endian, Unicode: 移动(unicode 编码\u79fb\u52a8) 联通(unicode 编码\u8054\u901a) Unicode 转换UTF-16 Little-endian: 直接加上文件头FE FF 交换高低八位 由FF FE文件头知这是Unicode的UTF-16 Little-endian编码方式 Unicode big endian 移动 联通 Unicode转换Unicode big endian : 直接加上文件头FE FF 文件头 FE FF 编码方式UTF-16 Big-endi UTF-8 0800—FFFF | | 00001000 00000000到 11111111 11111111 | 1110YYYY 10YYYYXX 10XXXXXX (X低八位) (Y高八位) |
移动 “移” 用Unicode编码查看器查看为 \u79fb二进制: 0111100111111011 在0800—FFFF之间 转为为UTF8: 11100111 10100111 10111011 16进制: E7A7BB “动” 用Unicode编码查看为\u52a8 二进制 00101001010101000 在0800—FFFF之间 转为为UTF-8: 11100101 10001010 10101000 16进制:E58AA8 联通
“联”Unicode编码 \u8054 二进制 1000000001010100 转换为UTF-8:11101000 10000001 10010100 16进制:E88194 “通” Unicode 编码 \u901a 二进制 1001000000011010 转换为UTF-8: 11101001 10000000 10011010 16进制:E9809A
文件头 EF BB BF 编码方式 UTF-8
|