刨根究底字符编码之十六——Windows记事本的诡异怪事:微软为什么跟联通有仇?(没有BOM,所以被误判为UTF8。“联通”两个汉字的GB内码,其第一第二个字节的起始部分分别是“110”和“10”,,第三第四个字节也分别是“110”和“10”)
1. 当用一个软件(比如Windows记事本或Notepad++)打开一个文本文件时,它要做的第一件事是确定这个文本文件究竟是使用哪种编码方式保存的,以便于该软件对其正确解码,否则将显示为乱码。 一般软件确定文本文件编码方式的方法有如下三种: 检测文件头标识; 提示用户手动选择; 根据一定的规则自行推断。 2. 文件头标识一般指的是字节顺序标记BOM(Byte Order Mark),位于文件的最开始。当打开一个文本文件时,就BOM而言,有如下几种情形: BOM为:EF BB BF ——表示编码方式为UTF-8; BOM为:FF FE ——表示编码方式为UTF-16LE(小端序); BOM为:FE FF ——表示编码方式为UTF-16BE(大端序); BOM为:FF FE 00 00 ——表示编码方式为UTF-32LE(小端序); BOM为:00 00 FE FF ——表示编码方式为UTF-32BE(大端序); 没有BOM ——要么显式地提示用户手动选择一种编码方式,要么隐式地由软件按规则自行推断出编码方式。 3. 接下来,是见证诡异怪事的时刻。 当你在简体中文版的Windows记事本里新建一个文件,输入“联通”两个汉字之后,保存为一个txt文件。然后关闭,再次打开该txt文件后,你会发现刚才输入并保存的“联通”两个汉字竟然莫名其妙地消失了,取而代之的是几个乱码。如下图所示。