nav*_*een 1 c# xml asp.net 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>
Run Code Online (Sandbox Code Playgroud)
问题
我把整个东西都包裹在我的客户端进行测试.测试环境是
服务器:Windows Server 2008 R2 64位
区域设置:德语(de-DE)
而现在,当我尝试读取XML时,Elmah会抛出两个错误错误.第一个错误是
System.Xml.XmlException:'',十六进制值0xA000D,是无效字符.第1行,位于System.Xml.XmlTextReaderImpl.Throw(String res,String [] args)的System.Xml.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace(),位于System.Xml.Linq的System.Xml.XmlTextReaderImpl.ParseDocumentContent()处. System.Xml.Linq.XDocument.Load(String uri,LoadOptions选项)中的XDocument.Load(XmlReader reader,LoadOptions选项)位于c:\ Webs\ThirdPartyLogins\Administrator\SiteSettings中的Administrator_SiteSettings.SaveSettingsButton_Click(Object sender,EventArgs e). aspx.cs:第48行
我将这些XML节点值带到一个字典,然后出现此错误,字典中找不到键错误.
编码的罪魁祸首?
我的代码可能有什么问题?
1)在将编码更改为utf-16时,出现了新的错误
在utf-16中,它的System.Xml.XmlException:'.',十六进制值0x00,是一个无效字符.第1行,第39位.
2)之前粘贴的XML不完整.它有一些节点,一些URL作为节点数据.这会是一个问题吗?还更新了XML.
简短的回答:是的,编码是罪魁祸首; 正确的编码是utf-16.
答案很长:线索在于异常文本,其中显示"十六进制值0xA000D"和"第1行,第40位".
当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是小端).
但是,正如错误消息所述,实际的"字符"读取是A000D,这意味着接下来的4个字节是0D 00 0A 00(再次记住little-endian).这非常接近,但显然只有2个字节用于每个字符而不是4.我们有一个名字,不是吗?它被称为UTF-16!