C#帮助使用StreamReader读取外来字符

58 c# encoding

我正在使用下面的代码来读取包含外来字符的文本文件,该文件是ANSI编码的,在记事本中看起来很好.下面的代码不起作用,当读取文件值并在数据网格中显示字符显示为正方形时,其他地方是否会出现其他问题?

StreamReader reader = new StreamReader(inputFilePath, System.Text.Encoding.ANSI);
using (reader = File.OpenText(inputFilePath))
Run Code Online (Sandbox Code Playgroud)

谢谢

更新1:我已经尝试了所有编码System.Text.Encoding.并且都无法正确显示文件.

更新2:我已经将文件编码(重新保存文件)更改为unicode并使用,System.Text.Encoding.Unicode并且它工作得很好.那么为什么记事本读得正确呢?为什么没有System.Text.Encoding.Unicode读取ANSI文件?

Jer*_*ban 125

您也可以尝试使用当前系统的ANSI代码页的默认编码.

StreamReader reader = new StreamReader(inputFilePath, Encoding.Default, true)
Run Code Online (Sandbox Code Playgroud)

当您尝试将记事本"另存为"菜单与原始文件一起使用时,请查看编码组合框.它将告诉您文件使用的记事本猜测的编码.

此外,如果它是ANSI文件,则detectEncodingFromByteOrderMarks参数可能没有多大帮助.

  • 使用默认编码对我有用。我有被StreamReader跳过的char(Â),并将其更改为默认的Encoding可以正确读取。谢谢! (2认同)
  • Encoding.Default 对我有用... ANSI 格式的西班牙语字符将像 %^ 和 ? 在使用 Encoding.Default 之前。 (2认同)

Qui*_*son 23

是的,可能是文件的实际编码,可能是unicode.尝试使用UTF-8,因为这是最常见的unicode编码形式.否则,如果文件ASCII然后标准ASCII编码应该工作.


ser*_*rop 23

我有同样的问题,我的解决方案很简单:而不是

Encoding.ASCII
Run Code Online (Sandbox Code Playgroud)

使用

Encoding.GetEncoding("iso-8859-1")
Run Code Online (Sandbox Code Playgroud)

答案在这里找到.

编辑:更多解决方案.这可能更准确一个:

Encoding.GetEncoding(1252);
Run Code Online (Sandbox Code Playgroud)

此外,在某些情况下,如果您的操作系统默认编码与文件编码匹配,这也适用于您:

Encoding.Default;
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 9

使用Encoding.Unicode将无法准确解码ANSI文件,就像JPEG解码器无法理解GIF文件一样.

我很惊讶,Encoding.Default如果它确实 ANSI,那么对ANSI文件不起作用- 如果你确切地发现记事本正在使用哪个代码页,你可以使用Encoding.GetEncoding(int).

一般来说,我建议尽可能使用UTF-8.


Jak*_*sen 7

尝试使用其他编码,例如Encoding.UTF8.您也可以尝试让StreamReader找到编码本身:

    StreamReader reader = new StreamReader(inputFilePath, System.Text.Encoding.UTF8, true)
Run Code Online (Sandbox Code Playgroud)

编辑:刚刚看到您的更新.尝试让StreamReader做猜测.


jag*_*123 5

对于瑞典语 \xc3\x85 \xc3\x84 \xc3\x96 ,上述工作的唯一解决方案是:

\n\n
Encoding.GetEncoding("iso-8859-1")\n
Run Code Online (Sandbox Code Playgroud)\n\n

希望这会节省某人的时间。

\n