Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以检测两种可能的文本文件编码?_C#_.net_Character Encoding - Fatal编程技术网

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
  • 否则,假设它是ISO-8859-2
  • 然而,是否有可能检测到 编码是否为以下两种方式之一 允许吗

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

    如果您至少有一个“可检测”编码,那么您可以检查可检测编码,并使用不可检测编码作为回退

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

    请参阅我(最近)对链接问题的回答:


    此类将检查文件是否为UTF-8,然后尝试猜测是否为UTF-8。在我的例子中,文件是在外部环境中创建的。如何“执行UTF-8有效性检查”?如果数据是无效的UTF-8,则n Encoding.GetString将引发ArgumentException。