编码错误 - xml数字替换被误解了

问题描述:

我有xml文件表示从邮件客户端导出的电子邮件。不幸的是,当我尝试读取这些文件时,特殊字符不会显示为显示原始字符。编码错误 - xml数字替换被误解了

我试图让我在.NET中编写的客户端中正确读取。

例子:我碰到下面的数字替代:

á 

这被解释为:

á 

而原来的/期望值是:

ú 

一个可能被更好的例子:

Tað eftir er av árinum ber tó til at logga á 

这被解释为:

Tað eftir er av árinum ber tó til at logga á 

原始/期望值是:

Tað eftir er av árinum ber tó til at logga á 

我可以观察到,这个问题似乎是,该净解释Ã °为两个独立的角色,而实际上代表一个角色。

我相信,我应该能够使用本网站翻译解释值注入预期值(虽然没有确切的文字,我得到):http://www.i18nqa.com/debug/utf8-debug.html

但我无法得到它正确显示。净。

x.Load(
    New StreamReader(
    File.Open("content.xml", FileMode.Open), 
    Encoding.GetEncoding(1252), True 
) 
) 

这没有什么区别。如果我尝试Encoding.Unicode则无法读取文件(错误:在根级别无效数据)

+0

为什么你会期望两个数字替换被解析为单个字符?数字替换用于*字符*实体,而不是*字节*。 TL; DR:我相信你的XML不正确,不是.NET的处理。 –

+0

也许我可以手动取两个十进制值195和161并将其转换为十六进制,这会变成c3和ba,这是字符ú的UTF-8十六进制值。但是,这种转换功能是不是内置在.net中? – Andras

+0

我想你已经错过了我的观点。.NET中的XML处理正在做它应该做的事情。如果你想用XML表示U + 00FA,它应该表示为'ú'或'ú'。实体中的数字是一个代码点,如下所示:https://www.w3.org/TR/xml/#sec-references - 它不是*意思是“一个字节,它是编码表示的一部分一个人物”。 –

找到我的答案在另一篇文章:https://stackoverflow.com/a/5130065/1113421

端了第一次加载在UTF-8的文件,然后我需要的XML节点上,我转换他们对即时:

VB代码

Dim x As New XmlDocument 

x.Load(New StreamReader(File.Open("content.xml", FileMode.Open), Encoding.UTF8, True)) 

Dim nl As XmlNodeList = x.SelectNodes("product/HEADER/object") 

    For Each nd As XmlNode In nl 
    Dim result As String = Encoding.UTF8.GetString(Encoding.GetEncoding("ISO-8859-1").GetBytes(nd.InnerText)) 
    Me.txtTemporaryTextbox.Text += result & vbCrLf 
    Next 

这给我的外文字符的正确解释在nd.InnerText

感谢@JonSkeet的详细说明和链接,指出我朝着正确的方向进一步挖掘。

+0

从字节流(例如文件)加载XML时,不需要指定字符编码。只需让XML引擎找出编码。加载文件时,请勿使用字符阅读器,请使用字节流。 –