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)”是一个“方法”