Crazwly 发表于 2016-2-25 12:57

深入了解Windows编码方式


      用winhex等工具软件查看记事本中几种编码方式不同.

1. 新建一个文本文档输入“联通”,再次打开Winhex查看:
这里先要了解Unicode与UTF-8的关系:UTF-8是由Unicode变化而来X为低八位 Y高八位
Unicode编码字节数表示为二进制   UTF-8
0000—007F100000000到 0111 1111 0XXXXXXX
0080—07FF20000000010000000到0000011111111111 110YYYXX 10XXXXXX
0800—FFFF 30000100000000000到11111111111111111110YYYY10YYYYXX   10XXXXXX
10000--1FFFFF4000000010000000000000000到00011111   1111111111111111 11110XXX10XXXXXX 10XXXXXX 10XXXXXX
记事本输入“联通”用的是本地字符集GBK 分析:这时我们看看utf8的编码格式:    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(第一个字节)≤DF80≤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-endiUTF-8
0800—FFFF 30000100000000000到11111111111111111110YYYY10YYYYXX10XXXXXX(X低八位)(Y高八位)
移动 “移” 用Unicode编码查看器查看为 \u79fb二进制:   0111100111111011 在0800—FFFF之间转为为UTF8:   11100111 10100111 10111011 16进制: E7A7BB“动” 用Unicode编码查看为\u52a8 二进制       00101001010101000 在0800—FFFF之间转为为UTF-8:11100101 10001010 1010100016进制: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

Shark恒 发表于 2016-2-25 13:16

每次碰到乱码问题都是重新编译一下编码,一直也没深入看看。。有机会仔细读一下。

Bu弃 发表于 2016-2-25 13:36

好高深。完全看不懂。{:7_239:}

蓝色贝雷帽 发表于 2016-2-25 14:42

明白了为什么会出现乱码

随风逍遥 发表于 2016-6-28 13:27

收藏 有空仔细看看。

别管我了行 发表于 2022-4-2 03:45

凌夏随缘 发表于 2022-6-2 23:35

谢谢分享

yexing 发表于 2022-11-10 13:48

谢谢,学习一下

曾经沧海 发表于 2022-12-18 21:04

有帮助,多多支持!

sjtkxy 发表于 2022-12-19 05:38

页: [1] 2
查看完整版本: 深入了解Windows编码方式