记事本输入“联通”俩字,关闭再打开乱码

-------------------------------------------欢迎查看字符编码【专栏】------------------------------------------------------------------
汉字编码之GBK编码【点击】                                              判断汉字正则表达式更严谨方法【点击
记事本输入“联通”俩字,关闭再打开乱码 【点击】              iPhone emoji问题牵出的Unicode代理区的思考【点击
Unicdoe【真正的完整码表】对照表【点击】                      开源工程ZipArchive,压缩中文文件名乱码问题【点击
base64加密,解密,encode,decode,编码详解+实现【点击】 
网络传输文本,urlEncode和urldecode的iOS实现【点击】 字符编码的奥秘utf-8, Unicode【点击
--------------------------------------------------------------------------------------------------------------------------------------------------

记事本输入“联通”俩字,关闭再打开乱码

    这是个很有意思的事情。
    这里需要提一下ANSI,不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。 然后,这些编码方式没有固定的格式,但是比如说UTF-8的格式是非常明显的,比如最高位是0,110,1110等等。 在记事本保存操作中,windows默认保存的编码是ANSI(在中国是 GB2312 )。

    这样联通这两个字的二进制内码是:(一个字占两个字节)


“联”ANSI编码是  0xC1AA 二进制排列是 1100 0001   1010 1010;

“通”ANSI编码是  0xCDA8 二进制排列是 1100 1101  1010 1000;


下图是utf-8的格式的部分截图



    巧合的地方在于:“联通”这两个字的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]之间就行,貌似联通躺着也中枪,那么我们力挺联通吧,比如“力挺联通”四个字儿照样是乱码。呵呵,没辙儿了,开玩笑。其实你只要找到符合条件的汉字太容易了。


    如何标明一个文件是utf8格式呢?这个标记是可选的:EF BB BF。比如,用windows自带的记事本创建一个utf8格式的文件,就会加上这个标记。但是,如果用ultraedit创建utf8文件,并不会加上这个标记。这个标记有个术语,叫做BOM(Byte Order Mark)。不带BOM的utf8文件和GB2312文件怎么区分呢?我也不知道。唯一能想到的办法就是:先用一种试,如果出现乱码,就用另一种再试

评论 2 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:Age of Ai 设计师:meimeiellie 返回首页

打赏作者

hherima

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值