C# 是否可以检测两种可能的文本文件编码?
我读 检测编码是不可能的。但是,是否可以检测编码是否是两种允许的编码之一C# 是否可以检测两种可能的文本文件编码?,c#,.net,character-encoding,C#,.net,Character Encoding,我读 检测编码是不可能的。但是,是否可以检测编码是否是两种允许的编码之一 例如,我允许用户对其csv文件使用Unicode UTF-8和iso-8859-2。是否可以检测到它是前者还是后者?由于无法检测编码,因此即使将编码限制为两种可能的编码,也无法检测到它 我能想到的唯一一件事是,你可以尝试用两种可能的编码方式中的一种进行编码,但是你必须检查它是否正确。这将涉及到对文本的解析,即使这样,您也无法100%确定它是否正确。这两种编码对于所有八位位组=128都具有相同的含义,以进行确定。由于在UTF
例如,我允许用户对其csv文件使用
Unicode UTF-8
和iso-8859-2
。是否可以检测到它是前者还是后者?由于无法检测编码,因此即使将编码限制为两种可能的编码,也无法检测到它
我能想到的唯一一件事是,你可以尝试用两种可能的编码方式中的一种进行编码,但是你必须检查它是否正确。这将涉及到对文本的解析,即使这样,您也无法100%确定它是否正确。这两种编码对于所有八位位组=128都具有相同的含义,以进行确定。由于在UTF-8中,八位字节>=128总是成组出现(对于较长序列上的两个八位字节,用于编码单个代码点),因此三个八位字节序列{=128,如果使用StreamReader,则会有一个重载,它将在可能的情况下检测编码(BOM),但如果检测失败,则默认为UTF8 我建议您使用两个选项(UTF8或Current),如果用户选择Current,您将使用
var encoding = Encoding.GetEncoding(
CultureInfo.CurrentCulture.TextInfo.OEMCodePage);
var reader = new StreamReader(encoding);
这将是最有希望的正确编码
例如,我允许用户使用
Unicode UTF-8和iso-8859-2的
csv文件。是否可以检测到
是前者还是后者
这不可能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。在我的例子中,文件是在外部环境中创建的。如何“执行UTF-8有效性检查”?如果数据是无效的UTF-8,则n Encoding.GetString将引发ArgumentException。