在最近的工做中須要使用XML文件作數據存儲,因爲此XML文件的內容是不一樣的數據來源的數據,在解析XML文件時,遇到幾處類似的異常:無效的XML字符 (Unicode: 0x9e)。 (Unicode: 0x8b)。算法
Exception in thread "main" org.xml.sax.SAXParseException; lineNumber: 24; columnNumber: 180; 在文檔的元素內容中找到無效的 XML 字符 (Unicode: 0x9e)。apache
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)app
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source)編碼
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)spa
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)scala
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(Unknown Source)code
...xml
一開始,試圖對XML文件進行不一樣格式的修改,UTF-8,ANBI等等,均無效(後來明白過來了,字符值根本沒有改變), 接着去尋找解決辦法,試圖把Unicode轉變爲UTF-8,也找了相關的算法,可是XML中僅僅含有幾處Unicode字符,也沒能解決。unicode
後來找了一些資料發現這些字符有些共性:這些無效的字符在一些文檔中做爲文檔處理器的控制編碼(微軟選擇了那些再0x82到0x95之間的字符做爲"smart"標點),這些也被Unicode保留做爲控制編碼的,而且在XML中是不合法的。文檔
在下面的網頁中有全部的Unicode字符,對應的UTF-8字符,以及它表明的意義
http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=0x
最後我仍是把這些無效的Unicode字符轉變爲空字符(Scala代碼)
def UnicodeStringHandler(value:String) = { val chs = value.toArray for(i <- 0 until value.length()) { if (chs(i) > 0xFFFD) { chs(i) = ' '; } else if (chs(i) < 0x20 && chs(i) != '\t' & chs(i) != '\n' & chs(i) != '\r') { chs(i) = ' '; } else if(chs(i) >= 0x80 && chs(i) <= 0x9f){ chs(i) = ' '; } } new String(chs); }