2012-05-18 30 views
1

我只是目前沒有看到我自己。這應該是標準的:我得到一些帶有一些UTF-8字符的XML,我想解析它們。UTF-8字符在使用GWT解析後被損壞XMLParser

下面是一個例子: <person><name>Nguyển Thị Ngân</name></person>

當我解析此與GWTs XMLParser的並打印出名稱節點值,則字符被損壞:

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><person><name>Nguyển Thị Ngân</name></person>"; 

Document doc= XMLParser.parse(xml); 

NodeList list = doc.getElementsByTagName("name"); 
for(int i = 0; i < list.getLength(); i++){ 
    System.out.println("XMLParser: " + list.item(i).getFirstChild().getNodeValue()); 
} 
System.out.println("System.out: " + xml); 

的輸出是:

XMLParser: Nguyá»n Thá» Ngân

System.out: <?xml version="1.0" encoding="UTF-8"?><person><name>Nguyển Thị Ngân</name></person>

我解釋,它的字符亂七八糟與通過System.out打印無關。

這裏有什麼問題?

+0

如果您刪除了''-decl?你解析一個字符串,所以它已經由字符組成,而不是字節,因此不需要編碼。它可能是一個瀏覽器錯誤。此外,它是否發生在您測試過的所有瀏覽器中,或者只有其中一個? –

+0

你有沒有嘗試用unicode轉義碼替換非拉丁字符?仔細檢查您的開發環境是否將文件保存爲UTF-8。 – chooban

+0

@Thomas Broyer:刪除沒有任何區別。到目前爲止,我只將代碼作爲GWTTestCase運行。我會遵循您的建議,並在生產模式下的不同瀏覽器中進行測試。星期一會這樣做。 –

回答

0

我認爲這個問題與Thomas Broyer所描述的一樣。它不可能是chooban所說的,因爲打印原始XML可以按預期工作。您可以嘗試用它們的XML轉義碼替換unicodes:

StringBuilder xmlEscaped = new StringBuilder(); 
for(int i = 0; i < xml.length(); i++) { 
    char c = xml.charAt(i); 
    if (c < 127) { 
    xmlEscaped.append(c); 
    } else { 
    xmlEscaped.append("&#" + ((int) c) + ";"); 
    } 
} 
Document doc = XMLParser.parse(xmlEscaped.toString()); 
+0

Stefan Haustein:你的代碼給我預期的結果!非常感謝! 我想知道,爲什麼這不是XMLParser邏輯的一部分,因爲UTF-8字符如此使用。我本來期望它能夠「開箱即用」。 –

+0

這隻有在非ASCII字符不在元素或屬性名稱中時纔有效,對嗎? – Joey

+0

是的,這是正確的 –