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

我尝试检测文件中使用了哪种编码" title="字符编码">字符编码。

我尝试使用此代码来获取标准编码

public static Encoding GetFileEncoding(string srcFile)

{

// *** Use Default of Encoding.Default (Ansi CodePage)

Encoding enc = Encoding.Default;

// *** Detect byte order mark if any - otherwise assume default

byte[] buffer = new byte[5];

FileStream file = new FileStream(srcFile, FileMode.Open);

file.Read(buffer, 0, 5);

file.Close();

if (buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf)

enc = Encoding.UTF8;

else if (buffer[0] == 0xfe && buffer[1] == 0xff)

enc = Encoding.Unicode;

else if (buffer[0] == 0 && buffer[1] == 0 && buffer[2] == 0xfe && buffer[3] == 0xff)

enc = Encoding.UTF32;

else if (buffer[0] == 0x2b && buffer[1] == 0x2f && buffer[2] == 0x76)

enc = Encoding.UTF7;

else if (buffer[0] == 0xFE && buffer[1] == 0xFF)

// 1201 unicodeFFFE Unicode (Big-Endian)

enc = Encoding.GetEncoding(1201);

else if (buffer[0] == 0xFF && buffer[1] == 0xFE)

// 1200 utf-16 Unicode

enc = Encoding.GetEncoding(1200);

return enc;

}

我的前五个字节是60、118、56、46和49。

是否有图表显示哪种编码与前五个字节匹配?

回答:

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

回答:

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

但是即使没有BOM,UTF-32仍易于检测。这是因为Unicode代码点范围限制为U + 10FFFF,因此UTF-32单元始终具有模式00 {00-10}

xx xx(对于BE)或xx xx {00-10} 00(对于LE)

。如果数据的长度是4的倍数,并且遵循以下模式之一,则可以放心地假定它是UTF-32。由于面向字节的编码中很少有00个字节,因此误报几乎是不可能的。

回答:

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

回答:

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

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

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

回答:

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字符很少使用,因此无法使这种方法实用。

回答:

如果您的文件以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以外最常遇到的编码。

以上是 如何检测文本文件的字符编码? 的全部内容, 来源链接: utcz.com/qa/405801.html

回到顶部