45

我有一个包含非英语字符的文件,并使用非英语代码页以 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();
4

5 回答 5

68
 var text = File.ReadAllText(file, Encoding.GetEncoding(codePage));

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

于 2012-08-26T13:03:53.440 回答
12

当您的文本文件使用高 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
于 2016-05-10T17:17:44.103 回答
2

如果我没记错的话,无论 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() 方法无法解码 €(欧元)

于 2012-08-26T13:01:52.160 回答
0

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

String^ str2 = File::ReadAllText("MyText_cyrillic.txt",System::Text::Encoding::GetEncoding(1251)); 
textBox1->Text = str2;   
于 2021-04-28T18:59:03.020 回答
-1
using (StreamWriter writer = new StreamWriter(File.Open(@"E:\Sample.txt", FileMode.Append), Encoding.GetEncoding(1250)))  ////File.Create(path)
        {
            writer.Write("Sample Text");
        }
于 2017-03-16T10:32:43.053 回答