2008-10-19 130 views
4

我們的一個提供程序有時會發送標記爲UTF-8編碼文檔但包含未包含在UTF-8字符集中的字符的XML Feed。這將導致解析器拋出一個異常,停止建設的DOM對象,當遇到這些字符:修復XML文件中的錯誤編碼

DocumentBuilder.parse(ByteArrayInputStream bais) 

拋出以下異常:

org.xml.sax.SAXParseException: Invalid byte 2 of 2-byte UTF-8 sequence. 

有沒有一種方法來「捕捉」這些問題早並避免例外(即查找並從流中刪除這些字符)?我正在尋找的是「盡力而爲」類型的錯誤編碼文檔的後備。正確的解決方案顯然是從源頭上解決問題,並確保只交付正確的文檔,但如果不可能,那麼最好的方法是什麼?

回答

4

如果問題真的是錯誤的編碼(而不是混合編碼),則不需要對文檔進行重新編碼來解析它。只是解析它作爲一個讀者,而不是一個InputStream和DOM解析器會忽略標題:

DocumentBuilder.parse(new InpputSource(new InputStreamReader(inputStream, "<real encoding>"))); 
+0

感謝您的提示。它避免了這個異常,不幸的是,它並沒有幫到我太多,因爲它看起來非法的字符在我提取(和需要)的標識符字符串裏面,並且現在得到了錯誤的編碼。我想我只能等待內容提供商解決他們的錯誤。 – Burre 2008-10-20 09:29:01

2

您應該手動查看無效的文檔,並查看它們的常見問題。實際上它們很可能是另一種編碼(最可能的是windows-1252),最好的解決方案是從分解的系統中獲取每個文件並將其重新編碼爲UTF-8。

另一個可能的原因是混合編碼(一些元素的內容在一個編碼中,其他元素的內容在另一個編碼中)。這將很難解決。

您還需要一種方法來知道破損的系統何時被修復,以便您可以停止使用您的解決方法。

+0

我懷疑這是一種混合編碼(或者只是一些「流氓」字符),因爲來自同一個源的其他數據工作正常。它包含在瑞典的地點名稱,所以我懷疑他們有一些編碼不好的字符。 – Burre 2008-10-19 21:07:52

0

你應該告訴他們你正確的UTF-8發送。如果任何解決方案都不應該將壞字符重新編碼爲有效的UTF-8,那麼將其傳遞給解析器。其原因是如果保留了壞字符,那麼不同的程序可能會以不同的方式解釋任何輸出,這可能會導致安全漏洞。