如何判断一个文本文件内容的编码格式 UTF-8 ? ANSI(GBK)
(2012-07-20 18:10:57)分类: Cstyle |
windows下的notepad另存为选项有关于编码的选择,ANSI、Unicode、Unicode
big endian、UTF-8四种选择编码方式。其中ANSI是与你使用的windows操作系统的语言有关系的,向windows 7
简体中文版就是GBK(用一个字节表示英文,用两个字节表示一个中文)。第二个选项Unicode其实是指Unicode16
但是了,UTF-8也可以不要这三个字节的BOM,像用php的GD库生成图片时,如果有了BOM就会出错。而且在windows平台上,用notepad打开一个没有BOM的文本文件,也能正常显示,而不会当做ANSI(GBK)来处理。但是有这样的一个趣事,就是在notepad中输入“联通”两个中文,保存到本地,再打开,会发现乱码。这是为什么呢?
这个就设计到notepad判断文本编码的原理了。(这个原理是根据实验结果推测的,本人不保证其绝对与微软的思路一致)
notepad打开一个文本,有BOM这很容易判断是UTF系列编码,因为UTF-8,UTF-16 big endian, UTF-16 little endian ,UTF-32 big endian, UTF-32 little endian 的BOM都不一样。但是如果文本没有BOM,又不能立刻判定其为ANSI(GBK)编码,因为也有可能是无BOM的UTF-8。所以notepad会根据UTF-8的编码原理推测编码
UCS-4编码
U+00000000 –
U+0000007F
U+00000080 –
U+000007FF
U+00000800 –
U+0000FFFF
U+00010000 –
U+001FFFFF
……
比如中文都是用三个字节表示,若无BOM,则从文本第一个字节开始,按照UTF-8的编码规则去验证字符编码,例如:
第一个字节的第一个bit为0,说明是个ANSII字符,继续查看第二个比特,若第一个比特是1,则查看第二个比特,若第二个比特为0,说明这不是一个UTF-8编码的文本。依次类推,若一旦有一个bit不满足UTF-8编码要求,就判定文本为ANSI(GBK),若知道文本结束都不能判定,则说明文本是UTF-8编码的。
所以现在我们就能明白为什么在notepad中“联通”会乱码了。notepad中文本默认按ANSI(GBK)保存,没有BOM,打开时notepad会判断其编码,巧合的是联通的ANSI(GBK)编码为
C1 AA CD A8
11000001
知道了原理,我们就可以编写判断文本编码的软件了。这里我就不贴代码了。