怎么辨别文本文档的编码?

怎么辨别文本文档的编码?,第1张

文本文档,有的带有BOM(ByteOrderMark,字节序标志),即0xEF,0xBB,0xBF,有的没有。

Windows下的txt文本编辑器在保存UTF-8格式的文本文档时会自动添加BOM到文件头。

在判断这类文档时,可以根据文档的前3个字节来进行判断。然而BOM不是必需的,而且也不是推荐的。

对不希望UTF-8文档带有BOM的程序会带来兼容性问题,例如Java编译器在编译带有BOM的UTF-8源文件时就会出错。

而且BOM去掉了UTF-8一个期望的特性,即是在文本全部是ASCII字符时UTF-8是和ASCII一致的,即UTF-8向下兼容ASCII。

文件的字符集在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 代码页的编码。public System.Text.Encoding GetFileEncodeType(string filename){System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read) System.IO.BinaryReader br = new System.IO.BinaryReader(fs) Byte[] buffer = br.ReadBytes(2) if(buffer[0]>=0xEF){if(buffer[0]==0xEF &&buffer[1]==0xBB){ return System.Text.Encoding.UTF8 }else if(buffer[0]==0xFE &&buffer[1]==0xFF){ return System.Text.Encoding.BigEndianUnicode }else if(buffer[0]==0xFF &&buffer[1]==0xFE){ return System.Text.Encoding.Unicode }else{ return System.Text.Encoding.Default }}else{ return System.Text.Encoding.Default }}

查看TXT文件编码方式:

首先,不同编码的文本,是根据文本的前两个字节来定义其编码格式的。定义如下:

ANSI:无格式定义;

Unicode: 前两个字节为FFFE;

Unicode big endian: 前两字节为FEFF; 

UTF-8:  前两字节为EFBB; 

这样通过前面两个字节就可以判定出文件的具体格式了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/6055501.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-13
下一篇 2023-03-13

发表评论

登录后才能评论

评论列表(0条)

保存