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

52

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

74

2
我需要知道代码页。我事先不知道它。 - MichaelT
1
我看到旧版的MS记事本可以毫无问题地处理这个文件,感觉自己可能漏掉了什么。 - MichaelT
5
记住 http://www.joelonsoftware.com/articles/Unicode.html - 软件开发人员绝对必须知道的Unicode和字符集的绝对最低限度(无任何借口!) 作者:Joel Spolsky - gimel
1
请注意,.NET Core仅支持ASCII、ISO-8859-1和Unicode编码。因此,当尝试使用1252编码(ANSI Latin 1;西欧Windows)时,会出现错误。对我有效的是65000编码(utf-7 Unicode)。 - Martijn
显示剩余2条评论

14
当您的文本文件使用高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

2
应该是我个人认为最佳答案。此外,使用.NET Core 2.x或.NET Standard会遇到一个新问题。在<sigh>之前需要注册代码页..请参见https://dev59.com/7FoU5IYBdhLWcg3wCz2X - Philm
2
请注意,.NET Core仅支持ASCII、ISO-8859-1和Unicode编码。因此,当尝试使用1252编码(ANSI Latin 1;西欧Windows)时,您将会收到错误提示。对我有效的是65000编码(utf-7 Unicode)。 - Martijn

2
如果我没记错的话,XmlDocument.Load(string) 方法总是假定使用 UTF-8 编码,而不管 XML 的编码方式。 您需要创建一个带有正确编码的 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() 方法无法解码 €(欧元)

为什么不使用 File.ReadAllText - Adam
@MichaelT,你能给一个你的结果截图吗? - KF2
  • @MichaelT: 请尝试我的新回答。
- KF2
如果你的 XML 文件中的 <?xml?> 声明指定为 UTF-8,但是它不是一个正确的 UTF-8 流,则你得到的内容就不是格式良好的 XML。你真正需要做的是修复生成虚假 XML 文件的任何问题。 - bobince

0
using (StreamReader file = new StreamReader(filePath, Encoding.GetEncoding("ISO-8859-1")))
{
JsonSerializer serializer = new JsonSerializer();
IList<Type> result= (IList<Type>)serializer.Deserialize(file, typeof(IList<Type>));
      
                }
    
ANSI Code : ISO-8859-1

0
在我的c++/clr(WinForms)案例中,这种方法取得了成功:
String^ str2 = File::ReadAllText("MyText_cyrillic.txt",System::Text::Encoding::GetEncoding(1251)); 
textBox1->Text = str2;   

-1
using (StreamWriter writer = new StreamWriter(File.Open(@"E:\Sample.txt", FileMode.Append), Encoding.GetEncoding(1250)))  ////File.Create(path)
        {
            writer.Write("Sample Text");
        }

2
简单的代码解释可以更好地帮助理解。请解释一下这段代码的作用。 - Olcay Ertaş
我必须赞同@OlcayErtaş所说的话,特别是考虑到还有其他几个高质量的答案。 - EJoshuaS - Stand with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接