File.ReadAllText中的无效字符

本文关键字:无效 字符 ReadAllText File | 更新日期: 2023-09-27 18:04:25

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

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

什么会导致这个问题,我该如何解决它?

File.ReadAllText中的无效字符

文件很可能包含与默认编码不同的编码。如果您知道它,则可以使用File指定它。重写ReadAllText方法(String, Encoding)

代码示例:

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

如果你不知道的编码,参见前面的问题:如何使用ReadAllText当文件编码未知

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

默认的过载将假设UTF-8,除非它可以检测到UTF-32。

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

第一件事是找出的编码(例如ISO-8859-1 -但你需要检查 this),然后将其作为第二个参数传递。例如:

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

总是重要的是,在您尝试将二进制数据读取为文本之前,您必须知道它正在使用什么编码。对于文件,网络流,任何东西都是如此。

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

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

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

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

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