2009-10-19 48 views
3

SAX不斷死在以下異常:告訴SAX解析器忽略無效字符?

Invalid byte 2 of 3-byte UTF-8 sequence 

的問題是它的主要是正確的UTF-8編碼的,但也有它的幾個錯誤。我們無法獲得該文件的新版本,我們必須使用此文件。

那麼,我們如何告訴SAX忽略無效字符序列,或者清理UTF-8文件以使它沒有無效的UTF-8序列?

回答

2

我建議您將文件清理爲完全將其解析爲XML的單獨步驟。

UTF-8是一個相當容易理解的編碼; this web page顯示UTF-8是如何形成的。我建議你寫一個程序讀入你的輸入文件並寫出一個新文件。它將逐字節地讀取,只有當它看到它已經被有效地形成時才寫出一個字符。當它看到一個無效字節時,它會寫出字符串「UTF8ERROR」或其他一些在輸入數據中不會自然發現的容易找到的標記。它會跳過角色的其餘部分。

之後,您可以檢查發生錯誤的位置並修正數據...然後將其解析爲正常。

通過這種方式,您將看到錯誤有多廣泛,查看是否存在任何模式,並有可能糾正錯誤。如果您要從同一來源獲得更多數據,我強烈建議您告訴他們這個問題......這可能表明一個更嚴重的問題。

+0

所以基本上你確認了我希望不需要做的事情,我們必須編寫我們自己的UTF-8消毒劑 – corydoras 2009-10-19 06:36:36

+0

恐怕是這樣,網上可能有類似的東西,但我沒有知道的任何 – 2009-10-19 06:41:30

+0

尋找其他人與您的確切問題表明,你可能有你的編碼指定錯誤。如果是這樣的話,它可能是一個快速解決方法。請點擊這裏:http://www.openrdf.org/doc /sesame/users/ch09.html#d0e3707 – Gunslinger47 2009-10-19 06:51:11

3

您可以在SAX讀取它之前過濾該流。 創建一個InputStream,它讀取您的流並丟棄無效字符。

+0

我想它有一些人這樣說,但這是一種說明明顯的。 (: – corydoras 2009-10-19 06:34:51

1

SAX(和其他XML工具)被設計用於格式良好的XML(或者當需要時有效)。當輸入不正確時,他們故意拋出錯誤或異常,包括未能符合編碼。正如其他答案所建議的,你必須使用一個單獨的步驟來清理輸入。 (類似的,SAX會拋出HTML不正確的XML錯誤,比如缺少結束標籤)。

0

我想這不會幫助你多少,但也許其他人想知道:

檢索,將其與ISO-8859-1頭提供的UTF-8 XML文件時,我最近買了同樣的異常。解決的辦法是通過String.getBytes(字符集)手動指定UTF-8:

public Document parseRequest(HttpServletRequest request) { 
    DocumentBuilderFactory builder = DocumentBuilderFactory.newInstance(); 

    DataInputStream dataStream = new DataInputStream(request.getInputStream()); 
    String xml = dataStream.readUTF(); 
    ByteArrayInputStream byteStream = new ByteArrayInputStream(xml.getBytes("UTF-8")); 
    return builder.newDocumentBuilder().parse(byteStream); 
} 

編輯:..或者更簡單:

public Document parseRequest(HttpServletRequest request) { 
    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 

    Reader reader = new InputStreamReader(request.getInputStream(), "UTF-8"); 
    InputSource source = new InputSource(reader); 
    return domFactory.newDocumentBuilder().parse(source); 
} 
+0

確實對某些人有用的信息,但你是正確的,這並不能解決混合編碼存儲到單個文件中的問題。 – corydoras 2009-11-05 22:59:24

0

你能使用java.nio.charset中。 CharsetDecoder與InputStreamReader(InputStream in,CharsetDecoder dec)一起嗎?

如何解碼錯誤被處理 取決於針對 請求類型的錯誤,這是由 CodingErrorAction類的實例描述 的動作。可能的誤差 動作是忽略 錯誤輸入,經由返回 的CoderResult對象的錯誤報告給 調用者,或具有替換字符串的當前值 更換 錯誤輸入。 替換的初始值爲 「\ uFFFD」;其值可能會通過 replaceWith方法更改。

(從CharsetDecoder的javadoc)

+0

有趣的想法,我不確定。 – corydoras 2009-11-08 21:32:42