File.ReadAllText 中的字符无效

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 字符的字节序列,所以用 替换字符 替换它。

【讨论】:

以上是关于File.ReadAllText 中的字符无效的主要内容,如果未能解决你的问题,请参考以下文章

文件操作

File.ReadAllText(): System.UnauthorizedAccessException: '访问路径被拒绝。'

关于File.ReadAllText Method (String)

替换文件中的文本

ERROR: “System.Web.Mvc.Controller.File(string, string, string)”是一个“方法”

从字符串创建XElement