判断一个文本文件的编码格式
2016-03-01 18:16
393 查看
/article/5965988.html
文件的字符集在Windows下有两种,一种是ANSI,一种Unicode。
对于Unicode,Windows支持了它的三种编码方式,一种是小尾编码(Unicode),一种是大尾编码(BigEndianUnicode),一种是UTF-8编码。
我们可以从文件的头部来区分一个文件是属于哪种编码。当头部开始的两个字节为 FF FE时,是Unicode的小尾编码;当头部的两个字节为FE FF时,是Unicode的大尾编码;当头部两个字节为EF BB时,是Unicode的UTF-8编码;当它不为这些时,则是ANSI编码。
按照如上所说,我们可以通过读取文件头的两个字节来判断文件的编码格式,代码如下(C#代码):
程序中System.Text.Encoding.Default是指操作系统的当前 ANSI 代码页的编码。
分类: C#
windows下的notepad另存为选项有关于编码的选择,ANSI、Unicode、Unicode big endian、UTF-8四种选择编码方式。其中ANSI是与你使用的windows操作系统的语言有关系的,向windows 7 简体中文版就是GBK(用一个字节表示英文,用两个字节表示一个中文)。第二个选项Unicode其实是指Unicode16 little endian
。 第四个选项UTF-8大家都知道吧。但是有一个要注意的地方是,微软在windows平台下用自带的notepad.exe生成UTF-8编码的文本文件时会在文件开头加入三个字节的BOM(byte order mark)EF BB BF,这样就通过有无BOM区别文本的编码是ANSI(GBK)还是UTF-8。
但是了,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编码 UTF-8字节流
U+00000000 – U+0000007F 0xxxxxxx
U+00000080 – U+000007FF 110xxxxx 10xxxxxx
U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
……
比如中文都是用三个字节表示,若无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 10101010 11001101 10101000。这正好也是两个UTF-8编码的文字,当然这不是中文啦。所以notepad会认为这是一个UTF-8编码的文本,会安装UTF-8的格式来解析字符,于是乱码了。
知道了原理,我们就可以编写判断文本编码的软件了。这里我就不贴代码了。
文件的字符集在Windows下有两种,一种是ANSI,一种Unicode。
对于Unicode,Windows支持了它的三种编码方式,一种是小尾编码(Unicode),一种是大尾编码(BigEndianUnicode),一种是UTF-8编码。
我们可以从文件的头部来区分一个文件是属于哪种编码。当头部开始的两个字节为 FF FE时,是Unicode的小尾编码;当头部的两个字节为FE FF时,是Unicode的大尾编码;当头部两个字节为EF BB时,是Unicode的UTF-8编码;当它不为这些时,则是ANSI编码。
按照如上所说,我们可以通过读取文件头的两个字节来判断文件的编码格式,代码如下(C#代码):
程序中System.Text.Encoding.Default是指操作系统的当前 ANSI 代码页的编码。
windows下的notepad另存为选项有关于编码的选择,ANSI、Unicode、Unicode big endian、UTF-8四种选择编码方式。其中ANSI是与你使用的windows操作系统的语言有关系的,向windows 7 简体中文版就是GBK(用一个字节表示英文,用两个字节表示一个中文)。第二个选项Unicode其实是指Unicode16 little endian
。 第四个选项UTF-8大家都知道吧。但是有一个要注意的地方是,微软在windows平台下用自带的notepad.exe生成UTF-8编码的文本文件时会在文件开头加入三个字节的BOM(byte order mark)EF BB BF,这样就通过有无BOM区别文本的编码是ANSI(GBK)还是UTF-8。
但是了,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编码 UTF-8字节流
U+00000000 – U+0000007F 0xxxxxxx
U+00000080 – U+000007FF 110xxxxx 10xxxxxx
U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx
U+00010000 – U+001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
……
比如中文都是用三个字节表示,若无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 10101010 11001101 10101000。这正好也是两个UTF-8编码的文字,当然这不是中文啦。所以notepad会认为这是一个UTF-8编码的文本,会安装UTF-8的格式来解析字符,于是乱码了。
知道了原理,我们就可以编写判断文本编码的软件了。这里我就不贴代码了。
相关文章推荐
- 申请 SSL 证书 并且配置 iis 启用https协议
- 安装mariadb galera 10.0.22(二进制)
- 【小镇的技术天梯】黑客技术(1) MITM-中间人攻击
- Jstl标签的使用
- 二:Storm的配置项说明
- QT 同时支持鼠标和触摸屏
- android开发练习五-添加一个listview
- React-native 知识点-this.bind-返回键-React.cloneElement-控件显示隐藏-ScrollView
- HIVE2.0.0安装遇到的问题
- IOS 上传ipa文件失败
- win系统下node.js安装及环境配置.
- 2016.3.1
- angularjs手记-2016-03-01
- 蓝桥杯历届-打印十字图
- nginx使用配置说明
- 杂记录
- C#和Java区别
- 我在三月的边城里,陪你编程;一起等四月的流云来,摆渡此生
- 一个补零小函数
- mips 寄存器解释