【问题标题】:Invalid characters in File.ReadAllTextFile.ReadAllText 中的字符无效
【发布时间】:2013-03-07 00:49:15
【问题描述】:

我在一个旨在格式化我拥有的一些文件的程序中调用File.ReadAllText()

其中一些文件包含® (174) 符号。但是,在读取文本时,返回的字符串包含 (65533) 符号,而 ® (174) 应该是。

这是什么原因造成的,我该如何解决?

【问题讨论】:

    标签: c# text character-encoding special-characters symbols


    【解决方案1】:

    这可能是由于Encoding 不匹配造成的。使用 ReadAllText 重载允许您指定正确的 Encoding 在读取文件时使用。

    默认重载将采用 UTF-8,除非它可以检测到 UTF-32。任何其他编码都会错误地通过。

    【讨论】:

    • 该方法是否有理由不使用 Encoding.Default 因为它是默认编码?
    • @mrK 不知道为什么会这样,但这是框架设计者选择使用的。它已记录在案,但我同意,这是一个奇怪的选择。
    • 一种解释可能是Encoding.Default 使用系统的所谓当前ANSI 代码页,该代码页因系统而异。使用 UTF-8 可以避免在具有不同当前 ANSI 代码页的系统上进行编码和解码时产生的编码错误。此外 UTF-8 可以编码所有的 UNICODE。
    【解决方案2】:

    该文件很可能包含与默认编码不同的编码。如果您知道,可以使用 File.ReadAllText Method (String, Encoding) 覆盖指定它。

    代码示例:

    string readText = File.ReadAllText(path, Encoding.Default);  // <-- change the encoding to whatever the encoding really is
    

    如果您知道编码,请参阅之前的 SO 问题:How to use ReadAllText when file encoding unknown

    【讨论】:

    • Encoding.Default 不再适用于 .NET Core,总是返回 utf8...
    【解决方案3】:

    您需要在调用File.ReadAllText 时指定编码,除非文件实际上是UTF-8,听起来好像不是。 (基本上单参数重载相当于传入 UTF-8 作为第二个参数。我相信它还会检测带有适当字节顺序标记的 UTF-32。)

    第一件事是找出它 的编码方式(例如 ISO-8859-1 - 但您需要 检查 这个),然后将其作为第二个参数。

    例如:

    Encoding isoLatin1 = Encoding.GetEncoding(28591);
    string text = File.ReadAllText(path, isoLatin1);
    

    在尝试将二进制数据读取为文本之前,始终了解二进制数据的编码方式非常重要。文件、网络流等任何东西都是如此。

    【讨论】:

      【解决方案4】:

      您正在阅读的字符是替换字符

      用于替换值未知或在 Unicode 中无法表示的传入字符 比较使用U+001A作为控制字符来表示替代函数

      http://www.fileformat.info/info/unicode/char/fffd/index.htm

      你得到这个是因为文件的实际编码与你的程序期望的编码不匹配。

      默认情况下,ReadAllText 需要 UTF-8。它遇到一个不代表有效 UTF-8 字符的字节序列,所以用 替换字符 替换它。

      【讨论】:

        猜你喜欢
        • 2013-07-16
        • 1970-01-01
        • 2018-12-13
        • 1970-01-01
        • 2021-09-02
        • 2017-02-02
        • 2021-07-22
        • 1970-01-01
        相关资源
        最近更新 更多