更正大型Xml文件中的编码

时间:2010-12-15 19:35:15

标签: c# encoding character-encoding xml-parsing

我正在从包含此类内容的XML文件中导入数据:

<FirstName>™MšR</FirstName><MiddleName/><LastName>HšNER™Z</LastName>

XML通过以下方式加载:

 XmlDocument doc = new XmlDocument();

 try
 {
      doc.Load(fullFilePath);
 }

当我使用顶部包含的数据执行此代码时,我得到一个关于非法字符的异常。我理解那部分就好了。

我不确定这是哪种编码或如何解决此问题。有没有办法可以更改XmlDocument或其他方法的编码,以确保正确解析上述内容?


更新:我在本文档中没有任何编码声明或<?xml

我看过一些链接说动态添加它?这是UTF-16编码吗?

4 个答案:

答案 0 :(得分:3)

看来:

  • 名称为ÖMÜR HÜNERÖZ(或可能是ÔMÜR HÜNERÔZÕMÜR HÜNERÕZ;我不知道是哪种语言。
  • 使用DOS“OEM”代码页编码XML文件,可能是437或850。
  • 但它是使用windows-1252(“ANSI”代码页)解码的。

答案 1 :(得分:2)

如果您使用十六进制编辑器(例如HXD或Visual Studio)查看文件,您看到了什么?

您发布的字符串中的每个字符都是由单个字节表示的吗?该文件是否有字节顺序标记(文件开头有一堆不可打印的字节)?

The™和š似乎表明在编码/转换过程中出现了一些问题,但是让我们看看......我猜它们都与元音相对应( O -M- <强> A -R H- A -NER- O -Z,也许?),但我还没弄清楚他们最后是怎么看的像这样...

编辑dan04击中头部。 cp-1252中的的十六进制值为99,š为9a。在cp-437cp-850中,十六进制99表示Ö,而9a表示Ü

修复很简单:只需在打开XML文件时指定此编码:

XmlDocument doc = new XmlDocument();

using (var reader = new StreamReader(fileName, Encoding.GetEncoding(437)))
{
   doc.Load(reader);
}

答案 2 :(得分:1)

来自here

Encoding encoding;
using (var stream = new MemoryStream(bytes))
{
    using (var xmlreader = new XmlTextReader(stream))
    {
        xmlreader.MoveToContent();
        encoding = xmlreader.Encoding;
    }
}

您可能需要查看此内容:How to best detect encoding in XML file?

对于实际阅读,您可以使用StreamReader来处理BOM(字节顺序标记):

string xml;

using (var reader = new StreamReader("FilePath", true))
{                                   //            ↑ 
    xml= reader.ReadToEnd();       //        detectEncodingFromByteOrderMarks
}

修改:删除了编码参数。如果文件包含BOM,StreamReader将检测文件的编码。如果不是,它将默认为UTF8。

修改2 Detecting Text Encoding for StreamReader

答案 3 :(得分:0)

显然你提供了一个XML文档的片段,因为它缺少一个根元素,所以我认为这是你的意图。顶部是否有像<?xml version="1.0" encoding="UTF-8" ?>一样的xml处理指令?