File.ReadAllText中的字符无效

mrK*_*mrK 8 c# text symbols character-encoding special-characters

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

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

是什么导致这种情况,我该如何解决?

Ree*_*sey 13

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

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

  • 一种解释可能是 `Encoding.Default` 使用系统的所谓当前 ANSI 代码页,该代码页因系统而异。使用 UTF-8 可避免在具有不同当前 ANSI 代码页的系统上进行编码和解码时出现编码错误。此外,UTF-8 可以编码所有的 UNICODE。 (2认同)

Dav*_*vid 10

该文件很可能包含与默认编码不同的编码.如果您知道,可以使用File.ReadAllText方法(字符串,编码)覆盖来指定它.

代码示例:

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

如果您知道编码,请参阅此前的SO问题:如何在文件编码未知时使用ReadAllText


Jon*_*eet 7

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

的第一件事就是制定出哪些编码它在(如ISO-8859-1 -但你需要检查这一点),然后传递作为第二个参数.

例如:

Encoding isoLatin1 = Encoding.GetEncoding(28591);
string text = File.ReadAllText(path, isoLatin1);
Run Code Online (Sandbox Code Playgroud)

始终是你知道你试着去阅读它作为文本之前编码的二进制数据是使用非常重要.对于文件,网络流,任何东西都是如此.