c# – 是否可以检测两种可能的文本文件编码?

我读了
How can I detect the encoding/codepage of a text file

检测编码是不可能的.但是有可能检测编码是否是允许的两种之一?

例如,我允许用户为其csv文件使用Unicode UTF-8和iso-8859-2.有可能检测它是前者还是后者?

最佳答案

For example I allow user to use
Unicode UTF-8 and iso-8859-2 for their
csv files. Is it possible to detect
whether it is former or latter?

100%精度是不可能的,因为例如,字节C3 B1在ISO-8859-2中是“ñ”的同等有效表示,因为它们在UTF-8中是“ñ”.实际上,因为ISO-8859-2为所有256个可能的字节分配了一个字符,所以每个UTF-8字符串也是一个有效的ISO-8859-2字符串(如果是非ASCII,则代表不同的字符).

然而,反过来却不是这样. UTF-8对什么序列有效有严格的规定.超过99%的可能的8个八位字节序列不是有效的UTF-8.你的CSV文件可能比这长得多.因此,如果您:

>执行UTF-8有效性检查.如果通过,则假设数据为UTF-8.
>否则,假设它是ISO-8859-2.

However is it possible to detect
whether encoding is one of two
allowed?

通过验证可以可靠地检测UTF-32(字节顺序),UTF-8和CESU-8.
UTF-16可以通过BOM的存在来检测(但不能通过验证来检测,因为偶数长度的字节序列无效UTF-16的唯一方法是使用不成对的代理).

如果您至少有一个“可检测”编码,则可以检查可检测的编码,并使用不可检测的编码作为后备.

如果两种编码都是“不可检测的”,如ISO-8859-1和ISO-8859-2,那么它就更难了.您可以尝试像chardet使用的统计方法.

点赞