首页 > 代码库 > 记事本输入“联通”俩字,关闭再打开乱码
记事本输入“联通”俩字,关闭再打开乱码
记事本输入“联通”俩字,关闭再打开乱码
在记事本保存操作中,windows默认保存的编码是ANSI(在中国是GB2312)。
这样联通这两个字的二进制内码是:(一个字占两个字节)
“联”ANSI编码是 0xC1AA 二进制排列是 1100 0001 1010 1010;
“通”ANSI编码是 0xCDA8 二进制排列是 1100 1101 1010 1000;
巧合的地方在于:“联通”这两个字的ANSI编码符合utf8编码的第二个模板(参考这里)。“联”的两个字节、“通”的两个个字节的起始部分的都是"110"和"10",正好与UTF8规则里的两字节模板是一致的,于是再次打开记事本时,记事本就误认为这是一个UTF8编码的文件(这才是原因),让我们把第一个字节的110和第二个字节的10去掉,我们就得到了"00001 101010",再把各位对齐,补上前导的0,就得到了"0000 0000 0110 1010",不好意思,这是UNICODE的0x006A,也就是小写的字母"j"(用UltraEdit可以看到字母 j ),而之后的两字节用UTF8解码之后是0x0368,这个字符什么也不是,显示乱码
这就是只有"联通"两个字的文件没有办法在记事本里正常显示的原因。
可以认为:当文档中的所有字符的二进制编码在[C0 ≤ AA(第一个字节) ≤ DF] [80 ≤ BB(第二个字节) ≤ BF]时,记事本都无法确认文本的编码格式,就按照UTF-8的格式来显示。 用“联通”来分析就是 C1在[C0,DF]之间,CD也在[C0,DF],AA和A8在[80,BB]之间。
这么说,不只是“联通”二字造成了乱码,只要找两个字的gbk码值在[C0,DF]之间就行,貌似联通躺着也中枪,那么我们力挺联通吧,比如“力挺联通”四个字儿照样是乱码。呵呵,没辙儿了,开玩笑。其实你只要找到符合条件的汉字太容易了。
记事本输入“联通”俩字,关闭再打开乱码