德国文化中的XML解析问题 - ASP.NET

时间:2011-04-02 15:01:44

标签: c# asp.net xml encoding webforms

编码平台:带有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(String   res,String [] args)at   System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace()   在   System.Xml.XmlTextReaderImpl.ParseDocumentContent()   在   System.Xml.Linq.XDocument.Load(的XmlReader   阅读器,LoadOptions选项)at   System.Xml.Linq.XDocument.Load(字符串   uri,LoadOptions选项)at   Administrator_SiteSettings.SaveSettingsButton_Click(对象   发件人,EventArgs e)in   C:\站点\ ThirdPartyLogins \管理\ SiteSettings.aspx.cs:行   48

我将这些XML节点值带到一个Dictionary,然后发生此错误,并且字典中找不到键错误 编码的罪魁祸首是什么? 我的代码可能有什么问题?

<小时/> 更新:只需阅读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。


1 个答案:

答案 0 :(得分:5)

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

答案很长:线索在于异常文本,其中表示&#34;十六进制值0xA000D&#34;和&#34;第1行,第40和第34页。

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

如果文件确实是UTF-32,接下来的4个字节是什么?好吧,>字符后文件中的下一个内容是换行符,换行符由两个字符组成,回车符和换行符(分别为Unicode,0D和0A)。所以我们希望接下来的4个字节是0D 00 00 00,接下来的4个字节是0A 00 00 00(记住,Windows是little-endian)。

但是,正如错误消息所述,实际的&#34;字符&#34;读取是A000D,这意味着接下来的4个字节是0D 00 0A 00(再次记住little-endian)。这非常接近,但显然只有2个字节用于每个角色而不是4个。我们有一个名字,不是吗?它被称为UTF-16!