【问题标题】:StreamReader weird error with �StreamReader 奇怪的错误与 �
【发布时间】:2011-11-14 21:14:23
【问题描述】:

StreamReader 将 '–' (alt+ 0150) 读取为 �,即使我有 UTF-8 编码并且我已将 detectEncodingFromByteOrderMarks (BOM) 设置为 true。有人可以指导我吗?

【问题讨论】:

  • 你试过Unicode编码吗?

标签: c# streamreader


【解决方案1】:

该字节码不会出现在 utf-8 编码文本中。以 utf-8 编码时为 '\u2013', 0xe2 + 0x80 + 0x93。如果您在数字键盘上键入 Alt+0150 时收到此字符,则您的默认系统代码页可能是 1252。只需将 Encoding.Default 传递给 StreamReader 构造函数即可。

【讨论】:

  • 完美的默认编码没有 detectEncodingFromByteOrderMarks 参数有效。你们太棒了,非常感谢
【解决方案2】:

您需要知道用于对文本进行编码的编码。没有办法解决这个问题。尝试不同的编码,直到获得所需的结果。

来自 MSDN:

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

这意味着使用该 BOM 只是一个额外的东西,可能会也可能不会起作用,或者很容易被覆盖

【讨论】:

  • 是的,我正在尝试其他编码
  • 关于使用 detectEncodingFromByteOrderMarks 参数的要点。谢谢!
【解决方案3】:

正如其他用户所写,此问题的可能原因是您尝试读取的文件的 ANSI 编码。当我以 ANSI 编码保存文件时,我重新创建了您所描述的问题。

尝试使用此代码:

 var stream = new StreamReader(fileName, Encoding.Default);

Encoding.Default 参数在这里很重要。此代码应正确读取您提到的字符。

【讨论】:

    猜你喜欢
    • 2012-06-12
    • 2015-07-03
    • 1970-01-01
    • 2016-09-05
    • 2018-06-03
    • 2012-07-14
    • 2010-11-17
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多