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

时间:2009-02-26 22:55:59

标签: c# encoding

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

StreamReader reader = new StreamReader(inputFilePath, System.Text.Encoding.ANSI);
using (reader = File.OpenText(inputFilePath))

由于

更新1 :我已尝试在System.Text.Encoding下找到的所有编码。并且都无法正确显示文件。

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

10 个答案:

答案 0 :(得分:119)

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

StreamReader reader = new StreamReader(inputFilePath, Encoding.Default, true)

当您尝试将记事本“另存为”菜单与原始文件一起使用时,请查看编码组合框。它会告诉你文件使用了哪种编码记事本。

此外,如果它是ANSI文件,则detectEncodingFromByteOrderMarks参数可能没什么用。

答案 1 :(得分:23)

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

答案 2 :(得分:21)

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

Encoding.ASCII

使用

Encoding.GetEncoding("iso-8859-1")

找到了答案here

编辑:更多解决方案。这可能更准确:

Encoding.GetEncoding(1252);

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

Encoding.Default;

答案 3 :(得分:9)

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

我很惊讶Encoding.Default对于ANSI文件不起作用,如果它真的 ANSI - 如果您确实找到哪个代码页记事本正在使用,您可以使用Encoding.GetEncoding(int)

一般情况下,我建议尽可能使用UTF-8。

答案 4 :(得分:7)

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

    StreamReader reader = new StreamReader(inputFilePath, System.Text.Encoding.UTF8, true)

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

答案 5 :(得分:3)

File.OpenText()始终隐式使用UTF-8 StreamReader。创建自己的StreamReader  而是实例,并指定所需的编码。 喜欢

using (StreamReader reader =  new StreamReader(@"C:\test.txt", Encoding.Default)
 {
 // ...
 }

答案 6 :(得分:0)

我解决了阅读葡萄牙语字符的问题,更改了记事本++上的源文件。

enter image description here

C#

    var url = System.Web.HttpContext.Current.Server.MapPath(@"~/Content/data.json");
    string s = string.Empty;
    using (System.IO.StreamReader sr = new System.IO.StreamReader(url, System.Text.Encoding.UTF8,true))
    {
          s = sr.ReadToEnd();
    }

答案 7 :(得分:0)

对于阿拉伯语,我使用了Encoding.GetEncoding(1256)。它运作良好。

答案 8 :(得分:0)

对于瑞典语ÅÄÖ,上述解决方案唯一的解决方案是:

Encoding.GetEncoding("iso-8859-1")

希望这可以节省一些时间。

答案 9 :(得分:0)

我还在读取包含法语和德语的导出文件。我使用了Encoding.GetEncoding(“ iso-8859-1”),此方法可以实现,没有任何挑战。