文本文件有不同的编码格式,如何识别保存的文本文件的格式呢?
windows在处理这个问题的时候,会在保存文件的前面添加一个标记,称为BOM:
BOM:(byte order mark), 字节顺序标记。
常见文件BOM对应的标记使用如下:
EF BB BF: UTF-8
FE FF:UTF-16 (big-endian)
FF FE:UTF-16 (little-endian)
00 00 FE FF:UTF-32 (big-endian)
FF FE 00 00:UTF-32 (little-endian)
如果没有这个标记,就会使用默认的系统环境编码(本地码)来解释这个文本文件,所以使用no bom(没有这个字节序标记)方式的文件,在不同的电脑(比如中文版和德文版,或者韩文版等)打开后的显示内容可能是不一样的。
这个编码方式,只适用于文本文件,二进制文件在任意电脑上都是一样的,它在计算机的存储内容是不可能被改变的。
文本文件,因为要用你能够认识的图形方式(字体)来显示对应的字符编码,所以是需要解释(用对应的编码翻译)才能显示的。
比如:
我们用ultraedit编辑一个文件,显示默认的编码名为简体中文(GBK)(中文环境的本地码),代码页936.
有关代码页和编码名称:参考另外文章<windows支持的编码页及其编码转换>。
用16进制查看其最终存储的二进制内容,可以看出来并没有任何标记(称为no bom)。
如果我们把编码转换为unicode呢?
没错,你看到的文字内容还是一样。
但是我们看看实际存储的文件内容–前面多了两个字节:FF FE。这就是BOM(字节序标记),他会告诉打开该文本文件的编辑器,这是一个UTF-16(unicode)编码的文件,你需要使用该编码来解释后面的内容。
大家可以看看,后面的内容也不一样了:
字符"abc",从61,62,63的本地码编码变为61 00,62 00,63,00的unicode编码.
字符"中文",从D6 D0,CE C4的本地码编码变为2D 4E,87 65的unicode编码.
所以,你的乱码就是因为你保存的文本文件的编码和打开的时候没有使用同一种方式去解释编码的原因导致的。
就好比你讲中文,听者只会英文,他就听不懂中文。