1.錯誤現象
我遇到過這樣的xml文件,用c++解析的時候,報如下的錯誤:
Fatal Error at file "d:/test2.xml", line 1, column 40
Message: An exception occurred! Type:UTFDataFormatException, Message:invalid byte 2 (? of a 2-byte sequence.
用java解析這個文件的時候,報如下錯誤
Invalid byte 1 of 1-byte UTF-8 sequence.
java.io.UTFDataFormatException: Invalid byte 1 of 1-byte UTF-8 sequence.
at org.apache.xerces.impl.io.UTF8Reader.invalidByte(Unknown Source)
at org.apache.xerces.impl.io.UTF8Reader.read(Unknown Source)
at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source)
at org.apache.xerces.impl.XMLEntityScanner.skipChar(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
2.程序內容
java程序內容如下:
c++程序用到了xerces-c,代碼段如下:
3.原因分析
文件test2.xml內容如下:
我把這個文件放在本地,用ie打開該文件,解析有問題,不能正常顯示。
修改encoding="gbk",然後說用ie打開,就沒有問題了。
再次運行java程序和c++程序,正常運行,沒有報告錯。
說明文件格式有問題,最簡單的解決辦法就是修改文件的encoding段。
但是有些時候這樣做起來可操作性能不強。
我遇到的問題是,別人發給我一個錯誤的文件,我打電話給對方,告訴他,文件格式有問題,對方不承認,還說別的廠商爲什麼沒有找他,“暈”,死活不修改,而且程序一直會自動運行,手工去修改顯然不顯示,用腳本修改文件的額內容也不好。
放心,程序是“萬能”的,平時遇到的所謂bug,看似不可能的問題,認真分析之後,都能通過程序來解決問題。
4.分析、解決問題
既然xml文件的內容沒有被編碼爲encoding指定的內容,我們可以把文件的內容讀出來,然後在進行編碼,將編碼後的內容進行解析,問題就解決了。
再不修改文件內容的情況下,修改java程序,內容如下:
運行正確,成功打印出根節點名字。
程序先將文件的內容讀出,然後轉換成utf-8的編碼,組裝成一個字符流進行解析。
c++程序也是一樣,先讀出文件內容,然後用icu轉換成utf-8編碼,組裝成內容結構進行解析。
c++程序段內容如下:
上面用到了一些icu的函數,沒有用過icu的兄弟,可以查看一下這方面的資料。