【问题标题】:Correcting Encoding in a large Xml File更正大型 Xml 文件中的编码
【发布时间】:2010-12-15 19:35:14
【问题描述】:

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

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

XML 是通过以下方式加载的:

 XmlDocument doc = new XmlDocument();

 try
 {
      doc.Load(fullFilePath);
 }

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

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


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

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

【问题讨论】:

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


    【解决方案1】:

    看来:

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

    【讨论】:

    • 好收获!我只看了 125x 的代码页——完全忘记了 DOS 的代码页……我会在回复中添加更多信息。
    【解决方案2】:

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

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

    ™ 和 š 似乎表明编码/转换过程中出现了很大的问题,但让我们看看...我猜它们都对应一个元音 (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);
    }
    

    【讨论】:

      【解决方案3】:

      来自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。

      编辑 2Detecting Text Encoding for StreamReader

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-11
          • 1970-01-01
          • 2010-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多