【问题标题】:Detect Encoding Latin1 and UTF-8检测编码 Latin1 和 UTF-8
【发布时间】:2020-09-15 10:56:08
【问题描述】:

我正在获取可以是 latin1 或 utf8 编码的文件。我将它作为 C# 中的流获取。如何检测它的 latin1 ("ISO-8859-1") 还是 UTF-8?当我尝试检测它时,它总是会将其检测为 UTF-8。 此代码不起作用,如果始终为 UTF-8。

     private Encoding GetUtf8EncodeStream(Stream fileStream)
            {    
     using var reader = new StreamReader(fileStream, true);
                    var encoding = reader.CurrentEncoding;
                    if (Equals(encoding, Encoding.UTF8))
                    {
                        return Encoding.UTF8;
                    }
                    return Encoding.GetEncoding("ISO-8859-1");
    }

void Method(){
 var encoding = GetUtf8EncodeStream(fileStream);
                    using (TextReader reader = new StreamReader(fileStream, encoding))
}

我首先需要知道编码,然后我将使用该编码读取它。

我需要知道编码,因为它有特殊字符 æ、ø 和 å。如果我尝试读取具有编码:latin1 的流并将流读取器设置为 UTF-8,则会出现问号而不是字符。如果我在我将 StreamWriter 设置为编码 UTF-8 的位置进行反转,并且它在 latin1 中,那么地狱将会失败;)

【问题讨论】:

  • 您正在检查的流是否包含 7 位 ASCII 范围之外的任何字符?如果不是,它可能会因此被检测为 UTF8(我会假设)。
  • 是的,它有一些字符 æ、ø 和 å。更新了我的问题。 :)
  • 您可以尝试验证该文件是否为有效的utf8。否则,恐怕没有算法可以检测编码。如果启用错误检测,UTF8Encoding.GetString(byteArray) 会抛出ArgumentException
  • "在有效多字节序列之外存在无效的 8 位字符也可用于“自动检测”编码实际上是扩展的 ASCII 编码而不是 UTF-8,并进行解码相应地。”见Wikipedia

标签: c# encoding utf-8 iso-8859-1 utf8mb4


【解决方案1】:

我找到了解决方案。 :) 这个网站给了我正确的答案。 https://archive.codeplex.com/?p=utf8checker

它检查它是否是有效的 UTF-8,而 Latin1 不是。然后我的代码很简单。

    private Encoding GetUtf8EncodeStream(Stream fileStream)
        {
            if (_utf8Checker.IsUtf8(fileStream))
            {
                return Encoding.UTF8;
            }

            return Encoding.GetEncoding("ISO-8859-1");
        }

  var encoding = GetUtf8EncodeStream(stream);
            stream.Position = 0;
            using (TextReader reader = new StreamReader(stream, encoding))

【讨论】:

    猜你喜欢
    • 2014-05-17
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2011-05-11
    • 2019-05-29
    • 2016-04-02
    相关资源
    最近更新 更多