【问题标题】:StreamReader "detect encoding" Strange BehaviorStreamReader“检测编码”奇怪的行为
【发布时间】:2016-09-05 22:21:43
【问题描述】:

我只是这样做:

using (var f = File.Open("File.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
      using (var sw = new StreamWriter(f, Encoding.ASCII))
      {
          sw.WriteLine("Test");
      }
}

using (var f = File.Open("File.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
      using (var sr = new StreamReader(f, detectEncodingFromByteOrderMarks: true))
      {
          var r = sr.ReadLine();
          var e = sr.CurrentEncoding;
          //e = UTF8Encoding ???????? !!!!!
      }
}

为什么流没有正确检测到编码?

【问题讨论】:

  • 你正在阅读的文件有字节序标记吗?
  • 您是否意识到自动编码检测主要是一种基于最佳猜测的方法...?你可能想看看 UDE。
  • ASCII 文件也是 UTF8 文件,所以可能你做对了!

标签: c# .net windows io stream


【解决方案1】:

我找到了,

From MSDN:

detectEncodingFromByteOrderMarks 参数通过以下方式检测编码 查看流的前三个字节。它会自动 识别 UTF-8、little-endian Unicode 和 big-endian Unicode 文本 如果文件以适当的字节顺序标记开始。否则, 使用 UTF8Encoding。有关更多信息,请参阅 Encoding.GetPreamble 方法 信息。

【讨论】:

  • 如 cmets 中所述,编码检测(在一般情况下)只是一种猜测。如果文件具有字节顺序标记或其他前导字节,则可能会检测到编码,或者您可能只是尝试打开一个二进制文件,由于某种原因,该文件的开头恰好有正确的字节。简而言之,如果您编写代码以便它只使用一种已知编码并且不试图猜测它,那么您将处于一个更好的世界。
  • 太棒了@LasseV.Karlsen,太好了。
【解决方案2】:

MSDN link on StreamReader.CurrentEncoding

在第一次调用 StreamReader 的任何 Read 方法后,该值可能会有所不同,因为编码自动检测直到第一次调用 Read 方法后才会进行。

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 2017-12-15
    • 1970-01-01
    • 2015-07-08
    相关资源
    最近更新 更多