【问题标题】:XML Parsing Problem in German Culture- ASP.NET德国文化中的 XML 解析问题 - ASP.NET
【发布时间】:2011-04-02 15:01:44
【问题描述】:

编码平台:使用 C# 的 ASP.NET WebForms 4.0

背景:我正在从 XML 中读取一些值,并且一切都在我的语言环境(en-US)中运行。 XML 看起来像这样

<?xml version="1.0" encoding="utf-32" ?>
<settings>
  <UserRegistration>AutoAuthorize</UserRegistration>
  <OpenIDProfile>PromptUser</OpenIDProfile>
  <EnableSpamProtection>Yes</EnableSpamProtection>
  <MaxAllowedOpenID>2</MaxAllowedOpenID>
  <WebsiteURL>http://localhost:70707/blah/</WebsiteURL>
  <FacebookOAuthURL>https://graph.facebook.com/oauth/authorize?</FacebookOAuthURL>
  <FacebookAccessTokenURL>https://graph.facebook.com/oauth/access_token?</FacebookAccessTokenURL>
  <FacebookRedirectPage>ausgefüllt.aspx</FacebookRedirectPage>
  <FacebookAppID>192328104139846</FacebookAppID>
  <FacebookAppKey>29daeb58d8ae84cc22181f4073e4ed9d</FacebookAppKey>
  <FacebookAppSecret>b94e9ddd20efc47b3227e7333925fdd8</FacebookAppSecret>
  <FacebookScope>email</FacebookScope>
  <EmailSettingsDisplayName>admin</EmailSettingsDisplayName>
  <EmailSettingsEmail>blah@blah.com</EmailSettingsEmail>
  <EmailSettingsPassword>192185135098207157230060249027191124199097098215</EmailSettingsPassword>
</settings>

问题

我将整个东西打包给我的客户进行测试。测试环境是

服务器:Windows Server 2008 R2 64 位
语言环境:德语(de-DE)

现在,当我尝试读取 XML 时,Elmah 抛出两个错误错误。第一个错误是

System.Xml.XmlException: '????', 十六进制值 0xA000D,是一个 无效字符。第 1 行,位置 40. 在 System.Xml.XmlTextReaderImpl.Throw(字符串 水库,字符串 [] 参数)在 System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace() 在 System.Xml.XmlTextReaderImpl.ParseDocumentContent() 在 System.Xml.Linq.XDocument.Load(XmlReader 阅读器,LoadOptions 选项)在 System.Xml.Linq.XDocument.Load(字符串 uri,LoadOptions 选项)在 Administrator_SiteSettings.SaveSettingsButton_Click(对象 发件人,EventArgs e) 在 c:\Webs\ThirdPartyLogins\Administrator\SiteSettings.aspx.cs:line 48

我正在将这些 XML 节点值放入字典中,此错误之后是字典的键未找到错误。
编码是罪魁祸首吗?
我的代码可能有什么问题?


更新:请阅读UTF-8, UTF-16, and UTF-32。 更改为 utf-8 会有帮助吗?
Update2:有两件事可以更清楚地说明问题。

1) 将编码更改为 utf-16 时,出现新错误

在 utf-16 它的 System.Xml.XmlException: '.',十六进制值 0x00,是一个 无效字符。第 1 行,位置 39.

2) 之前粘贴的 XML 不完整。它有更多的节点和一些 URL 作为节点数据。这会是个问题吗?也更新了 XML。


【问题讨论】:

  • 这似乎是一个编码问题。确定 XML 文件实际上是 UTF32 格式吗?

标签: c# asp.net xml encoding webforms


【解决方案1】:

简短回答:是的,编码是罪魁祸首;正确的编码是 utf-16。

长答案:线索在于异常文本,其中显示“十六进制值 0xA000D”和“第 1 行,位置 40”。

当 XmlReader 读取您的文件时,它首先读取 XML 声明(&lt;?xml?&gt; 之间的所有内容)以确定文件的其余部分使用哪种编码。在这种情况下,声明说 UTF-32。因此,在读取声明末尾的 &gt; 字符后,它立即切换到使用 UTF-32 编码。正如您链接的文章所解释的,UTF-32 使用 4 个字节来表示每个字符,因此 XmlReader 从文件中读取接下来的 4 个字节并尝试将它们解释为一个字符。 (这与您的错误消息一致,因为第 1 行位置 40 紧跟在 &gt; 字符之后。)

如果文件真的是 UTF-32,接下来的 4 个字节会是什么?好吧,文件中&gt; 字符之后的下一个内容是换行符,它由两个字符组成,回车符和换行符(在 Unicode 中分别为 0D 和 0A)。所以我们预计接下来的 4 个字节是 0D 00 00 00,接下来的 4 个字节是 0A 00 00 00(请记住,Windows 是 little-endian)。

但正如错误消息所述,实际读取的“字符”是 A000D,这意味着接下来的 4 个字节是 0D 00 0A 00(同样,请记住 little-endian)。这非常接近,但显然每个字符只使用 2 个字节而不是 4 个字节。好吧,我们有一个名称,不是吗?它叫做 UTF-16!

【讨论】:

  • +1 很好的解释。谢谢。我想,因为我使用的是德语(带有变音符号),所以最好提供 utf-8。你的想法?
  • 在 utf-16 中,它的 System.Xml.XmlException: '.',十六进制值 0x00,是一个无效字符。第 1 行,位置 39。
  • 嗯,在这一点上,能够看到构成 XML 文件的确切字节会有所帮助。有什么方法可以在这里发布(例如,base64 对其进行编码并附加到您的问题,或者压缩文件,将压缩文件上传到某处,然后链接到它)?
猜你喜欢
  • 2012-11-26
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多