Java處理帶BOM的文本

Java處理帶BOM的文本
 
提及BOM,這個問題還比較麻煩,由於BOM不可見,但用程序作不一樣編碼文本處理時候卻經常須要考慮到BOM的問題。在此以前,先對BOM作個簡單認識。
 
先看看帶BOM的文件:
源文件:
 
16進制打開:
 
 
 
下面舉個例子,針對UTF-8的文件BOM作個處理:
 
                String xmla = StringFileToolkit.file2String( new File( "D:\\projects\\mailpost\\src\\a.xml"), "UTF-8");
                 byte[] b = xmla.getBytes( "UTF-8");
                String xml = new String(b,3,b.length-3, "UTF-8");
                Document doc1 = DocumentHelper.parseText(xml);
                Element e1 = (Element)doc1.selectSingleNode( "/ResponseData/Body/RetDesc");
                Element e2 = (Element)doc1.selectSingleNode( "/ResponseData/Head/RespID");
                Element e3 = (Element)doc1.selectSingleNode( "/ResponseData/Body/RetCode");
                Element e4 = (Element)doc1.selectSingleNode( "/ResponseData/Body/RetDesc");
 
思路是:先按照UTF-8編碼讀取文件後,跳過前三個字符,從新構建一個新的字符串,而後用Dom4j解析處理,這樣就不會報錯了。
 
其餘編碼的方式處理思路相似,其實能夠寫一個通用的自動識別的BOM的工具,去掉BOM信息,返回字符串。
不過這個處理過程已經有牛人解決過了: http://koti.mbnet.fi/akini/java/unicodereader/
 
-------------------------------------------------一下引用了百科

BOM

BOM byte-order mark ),即 節順 標記,它是插入到以 UTF-8 UTF16 UTF-32 編碼 Unicode 文件開頭的特殊標記,用來識別 Unicode 文件的編碼類型。對於 UTF-8 來講, BOM 並非必須的,由於 BOM 用來標記多字節編碼文件的編碼類型和字節順序( big-endian little-endian )。
在絕大多數編輯器中都看不到 BOM 字符,由於它們能理解 Unicode ,去掉了讀取器看不到的題頭信息。若要查看某個 Unicode 文件是否以 BOM 開頭,可使用十六進制編輯器。下表列出了不一樣編碼所對應的 BOM
BOM
Encoding
EF BB BF
UTF-8
FE FF
UTF-16 (big-endian)
FF FE
UTF-16 (little-endian)
00 00 FE FF
UTF-32 (big-endian)
FF FE 00 00
UTF-32 (little-endian)

BOM的來

識別 Unicode 文件, Microsoft 全部的 Unicode 文件 應該 ZERO WIDTH NOBREAK SPACE U+FEFF )字符 開頭 一個 特徵符 節順 標記 byte-order mark BOM 識別 文件中使用的 編碼 和字 節順

不一樣的系統對BOM的支持

由於一些系統或程序不支持 BOM ,所以帶有 BOM Unicode 文件有時會帶來一些問題。
1.        JDK1.5 以及以前的 Reader 都不能處理帶有 BOM UTF-8 編碼的文件,解析這種格式的 xml 文件時,會拋出異常: Content is not allowed in prolog.
2.        Linux/UNIX 並無使用 BOM ,由於它會破壞現有的 ASCII 文件的語法約定。
不一樣的編輯工具對 BOM 的處理也各不相同。使用 Windows 自帶的記事本將文件保存爲 UTF-8 編碼的時候,記事本會自動在文件開頭插入 BOM (雖然 BOM UTF-8 來講並非必須的),可是 editplus 就不會這樣作。

BOMXML

XML 解析讀取 XML 文檔時, W3C 定義了 3 條規則:
1.        若是文檔中有 BOM ,就定 了文件 編碼
2.        若是文檔中沒有 BOM ,就 XML 聲明中的 編碼 屬性;
3.        若是上述二者都沒有,就假定 XML 文檔採用 UTF-8 編碼

參考料:

1.        UTF-8, UTF-16, UTF-32 & BOM http://www.unicode.org/faq/utf_bom.html#BOM
2.        XML FAQ Encoding http://www.opentag.com/xfaq_enc.htm
3.        Linux Unicode 編程: http://www.ibm.com/developerworks/cn/linux/i18n/unicode/linuni/
 
相關文章
相關標籤/搜索