C# 如何读取ANSI编码和非英语字母的文本文件?

C# 如何读取ANSI编码和非英语字母的文本文件?,c#,.net,unicode,utf-8,character-encoding,C#,.net,Unicode,Utf 8,Character Encoding,我有一个包含非英语字符的文件,该文件使用非英语代码页以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 St

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

如果我没记错的话,不管XML编码是什么,XmlDocument.Load(string)方法总是采用UTF-8。 您必须创建具有正确编码的StreamReader,并将其用作参数

xmlDoc.Load(new StreamReader(
                     File.Open("file.xml"), 
                     Encoding.GetEncoding("iso-8859-15"))); 
我刚刚偶然发现了微软的KB308061。有一段很有趣的话: 在XML文档的XML声明部分指定编码声明。例如,以下声明表示文档采用UTF-16 Unicode编码格式:

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

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

链接来源:


代码页列表:

当文本文件使用高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
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”和“
”);//将换行符更改为HTML
以我的c++/clr(WinForms)为例,这种方法取得了成功:

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

为什么不呢?——@MichaelT你能给我一个结果的屏幕截图吗?——@MichaelT:试试我的新答案如果你的XML文件中的
序言说的是UTF-8,而它不是一个合适的UTF-8流,那么你得到的是格式不正确的,因此不是XML。实际上,您需要修复生成虚假XML文件的任何问题。我需要了解代码页。我事先不知道。@MichaelT有一些开源库可以猜测编码,但这不是一个简单的过程。我看到旧MS记事本处理这个文件没有问题,并且认为我遗漏了一些东西。@MichaelT记住-绝对是每个软件开发人员的最小值绝对是,Joel SpolskyLittle Explanation with code帮助更多。请解释这段代码的作用。我必须支持@OlcayErtaş所说的,特别是考虑到还有其他几个高质量的答案。这应该是IMHO接受的答案。。此外,使用.NETCore2.x或.NET标准,您将遇到一个新问题。在..之前需要注册代码页。。请参见请注意,.NET Core仅支持ASCII、ISO-8859-1和Unicode编码。因此,当您尝试使用编码1252(ANSI拉丁语1;西欧窗口)时,将出现错误。适合我的是编码65000(utf-7 Unicode)。
using (StreamWriter writer = new StreamWriter(File.Open(@"E:\Sample.txt", FileMode.Append), Encoding.GetEncoding(1250)))  ////File.Create(path)
        {
            writer.Write("Sample Text");
        }
String^ str2 = File::ReadAllText("MyText_cyrillic.txt",System::Text::Encoding::GetEncoding(1251)); 
textBox1->Text = str2;