如何检测文本文件的字符编码?

如何检测文本文件的字符编码?,第1张

如何检测文本文件的字符编码

您不能依赖具有BOM表的文件。UTF-8不需要它。非Unipre编码甚至没有BOM。但是,还有其他方法可以检测编码。

UTF-32

BOM为00 00 FE FF(对于BE)或FF FE 00 00(对于LE)。

但是即使没有BOM,UTF-32仍易于检测。这是因为Unipre代码点范围限制为U + 10FFFF,因此UTF-32单元始终具有模式00 {00-10}
xx xx(对于BE)或xx xx {00-10} 00(对于LE)
。如果数据的长度是4的倍数,并且遵循以下模式之一,则可以放心地假定它是UTF-32。由于面向字节的编码中很少有00个字节,因此误报几乎是不可能的。

美国ASCII

没有物料清单,但您不需要一个。可以通过缺少80-FF范围内的字节来轻松识别ASCII。

UTF-8

BOM是EF BB BF。但是您不能依靠它。许多UTF-8文件没有BOM,特别是如果它们起源于非Windows系统。

但是您可以放心地假设,如果文件验证为UTF-8,则它 就是 UTF-8。误报很少见。

具体来说,假设数据不是ASCII,则2字节序列的误报率仅为3.9%(1920/49152)。对于7字节的序列,它小于1%。对于12个字节的序列,它小于0.1%。对于24字节的序列,它小于百万分之一。

UTF-16

BOM为FE FF(对于BE)或FF FE(对于LE)。请注意,UTF-16LE BOM位于UTF-32LE BOM的开头,因此请首先检查UTF-32。

如果您碰巧有一个主要由ISO-8859-1字符组成的文件,则文件的一半字节为00也将是UTF-16的有力指标。

否则,识别没有BOM的UTF-16的唯一可靠方法是寻找代理对(D [8-B] xx D [CF] xx),但是非BMP字符很少使用,因此无法使这种方法实用。

XML格式

如果您的文件以3C 3F 78 6D 6C字节(即ASCII字符“
<?xml”)开头,则查找

encoding=
声明。如果存在,请使用该编码。如果不存在,则采用UTF-8,这是默认的XML编码。

如果需要支持EBCDIC,还请寻找等效的序列4C 6F A7 94 93。

通常,如果您的文件格式包含编码声明,请查找该声明,而不要尝试猜测编码。

以上都不是

还有数百种其他编码,需要花费更多的精力进行检测。我建议尝试使用Mozilla的字符集检测器或它的.NET端口。

合理的默认值

如果您已排除UTF编码,并且没有指向不同编码的编码声明或统计信息检测,请使用ISO-8859-1或密切相关的Windows-1252。(请注意,最新的HTML标准
要求 将“
ISO-8859-1”声明解释为Windows-1252。)是Windows(英语)(以及其他流行语言,如西班牙语,葡萄牙语,德语和法语)的默认代码页,它是UTF-8以外最常遇到的编码。



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

原文地址: http://outofmemory.cn/zaji/5505816.html

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

发表评论

登录后才能评论

评论列表(0条)

保存