2017-10-18 37 views
0

我有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 - 它不是*意思是「一個字節,它是編碼表示的一部分一個人物」。 –

回答

0

找到我的答案在另一篇文章: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引擎找出編碼。加載文件時,請勿使用字符閱讀器,請使用字節流。 –