【问题标题】:System.XML and Encoding troubleSystem.XML 和编码问题
【发布时间】:2013-08-14 12:05:37
【问题描述】:

我有一个用于在现有示例上创建 XML 文档的应用程序。但这不是重点。今天发现如果打开的文件编码是ANSI,就会报错。在此之前,我使用文件 UTF-8 并没有出现这个问题。你应该怎么做?

代码片段:

string filepath;
XmlDocument xdoc = new XmlDocument();
XmlElement root;
...............
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    filepath = openFileDialog1.FileName;
    textBox1.Text = filepath;
    load();
}
...............
public void load()
{
    xdoc.Load(filepath);
    root = xdoc.DocumentElement;
...............

错误:

“System.Xml.XmlException”类型的未处理异常发生在 System.Xml.dll 附加信息: 指定编码。,第 35 行,位置 16。

在那一行是西里尔符号(俄语)。但是,如果我通过 NotePad++ 将此文档转换为 UTF-8 - 它会正确加载。

【问题讨论】:

  • 第35行到底是什么,你试过什么?

标签: c# xml character-encoding system.xml


【解决方案1】:

您可以使用StreamReader 读取具有正确编码的文件,然后将该流加载到接受流的XmlDocument overload 中。

using(var sr = new StreamReader(filepath, myEncoding))
{
   xdoc.Load(sr);
}

您可以通过GetEncoding方法获取myEncoding

【讨论】:

  • 没有帮助。现在不是错误,只是数据没有正确上传。这是屏幕截图:petromi.com/get/90f1577ad1.jpeg 我是这样做的:Encoding utf8 = new UTF8Encoding(false);
  • 您不应该使用UTF8 编码。相反,您需要使用相关的代码页。我注意到你已经添加了它是西里尔符号所以试试Encoding myEncoding= Encoding.GetEncoding(1251);
  • 是的,这是西里尔符号。现在我已经尝试了您的第二种方法,并且该文档(使用 ANSI 编码)正确上传,但是现在加载错误的 UTF-8 文档(petromi.com/get/2893929137.jpeg)。我应该怎么做才能识别 FILE 编码来决定使用什么加载文件方法?或者是否有一种更简单的方法可以让所有文件正确显示?
  • 准确识别文件编码是一个棘手的问题,但这个线程有各种答案stackoverflow.com/questions/90838/…。我不确定一种总是有效的方法(尽管其他人可能知道)。这是一个 hack,但如果您知道只有两种编码,您可以尝试在 Try...Catch 块中加载一种编码,如果抛出异常,请尝试使用另一种编码再次加载它。当然,如果可能有多种编码,这是一种不好的方法。
  • 我在考虑 try catch 但后来我发现至少有 3 种编码可以是我所知道的 =(( 但是谢谢你帮助我 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多