【问题标题】:How to read text files with ANSI encoding and non-English letters?如何读取具有 ANSI 编码和非英文字母的文本文件?
【发布时间】:2012-08-21 06:01:27
【问题描述】:

我有一个包含非英语字符的文件,并使用非英语代码页以 ANSI 编码保存。如何在 C# 中读取此文件并正确查看文件内容?

不工作

StreamReader sr=new StreamReader(@"C:\APPLICATIONS.xml",Encoding.ASCII);
var ags = sr.ReadToEnd();
sr=new StreamReader(@"C:\APPLICATIONS.xml",Encoding.UTF8);
ags = sr.ReadToEnd();
sr=new StreamReader(@"C:\APPLICATIONS.xml",Encoding.Unicode);
ags = sr.ReadToEnd();

工作但我需要提前知道代码页是什么,这是不可能的。

sr=new StreamReader(@"C:\APPLICATIONS.xml",Encoding.GetEncoding(1252));
ags = sr.ReadToEnd();

【问题讨论】:

    标签: c# .net unicode utf-8 character-encoding


    【解决方案1】:
     var text = File.ReadAllText(file, Encoding.GetEncoding(codePage));
    

    代码页列表:https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers?redirectedfrom=MSDN

    【讨论】:

    【解决方案2】:

    当您的文本文件使用高 ANSI 编码时,您会得到问号-菱形字符——这意味着它使用 127 到 255 之间的字符。这些字符设置了第八位(即最重要的位)。当 ASP.NET 读取文本文件时,它采用 UTF-8 编码,并且最高有效位具有特殊含义。

    您必须强制 ASP.NET 将文本文件解释为高 ANSI 编码,告诉它代码页是 1252:

    String textFilePhysicalPath = System.Web.HttpContext.Current.Server.MapPath("~/textfiles/MyInputFile.txt");
    String contents = File.ReadAllText(textFilePhysicalPath, System.Text.Encoding.GetEncoding(1252));
    lblContents.Text = contents.Replace("\n", "<br />");  // change linebreaks to HTML
    

    【讨论】:

    • 恕我直言,应该是公认的答案。此外,使用 .NET core 2.x 或 .NET Standard,您会遇到新问题。代码页需要在之前注册..见stackoverflow.com/questions/37870084/…
    • 请注意,.NET Core 仅支持 ASCII、ISO-8859-1 和 Unicode 编码。因此,当您尝试使用编码 1252(ANSI 拉丁语 1;西欧 Windows)时会出现错误。对我有用的是编码 65000(utf-7 Unicode)。
    【解决方案3】:

    如果我没记错的话,无论 XML 编码如何,XmlDocument.Load(string) 方法总是假定为 UTF-8。 您必须创建一个具有正确编码的 StreamReader 并将其用作参数。

    xmlDoc.Load(new StreamReader(
                         File.Open("file.xml"), 
                         Encoding.GetEncoding("iso-8859-15"))); 
    

    我刚刚偶然发现了来自 Microsoft 的 KB308061。有一段很有意思: 在 XML 文档的 XML 声明部分中指定编码声明。例如,以下声明表明文档是 UTF-16 Unicode 编码格式:

    <?xml version="1.0" encoding="UTF-16"?>
    

    请注意,此声明仅指定 XML 文档的编码格式,并不修改或控制数据的实际编码格式。

    链接来源:

    XmlDocument.Load() method fails to decode € (euro)

    【讨论】:

    • 为什么不File.ReadAllText
    • -@MichaelT 你能把你的结果截屏吗?
    • -@MichaelT :试试我的新答案
    • 如果您的 XML 文件中的 &lt;?xml?&gt; 序言说 UTF-8,并且它不是正确的 UTF-8 流,那么您所得到的不是格式正确的,因此不是 XML。确实,您需要修复产生虚假 XML 文件的任何内容。
    【解决方案4】:

    以我的 c++/clr (WinForms) 为例,这种方法取得了成功:

    String^ str2 = File::ReadAllText("MyText_cyrillic.txt",System::Text::Encoding::GetEncoding(1251)); 
    textBox1->Text = str2;   
    

    【讨论】:

      【解决方案5】:
      using (StreamWriter writer = new StreamWriter(File.Open(@"E:\Sample.txt", FileMode.Append), Encoding.GetEncoding(1250)))  ////File.Create(path)
              {
                  writer.Write("Sample Text");
              }
      

      【讨论】:

      • 对代码的小解释有助于更多。请解释这段代码的作用。
      • 我必须支持@OlcayErtaş 所说的话,尤其是考虑到对此还有其他几个高质量的答案。
      猜你喜欢
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2020-09-26
      • 2016-12-22
      相关资源
      最近更新 更多