编码平台:带有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,然后发生此错误,并且字典中找不到键错误
编码的罪魁祸首是什么?
我的代码可能有什么问题?
1)在将编码更改为utf-16时,出现了新的错误
在utf-16上它的System.Xml.XmlException: '。',十六进制值0x00,是 无效字符。第1行,位置 39。
2)之前粘贴的XML未完成。它有一些节点,一些URL作为节点数据。这会是一个问题吗?还更新了XML。
答案 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!