當前位置:才華齋>計算機>java語言>

java如何處理BOM文字

java語言 閱讀(1.7W)

說起BOM,這個疑問還比擬費事,由於BOM不可見,但用順序做不一樣編碼文字處置時分卻經常須要思索到BOM的疑問。在此之前,先對BOM做個容易見解。以下是小編為大家搜尋整理的java如何處理BOM文字,希望能給大家帶來幫助!更多精彩內容請持續關注我們應屆畢業生考試網!

java如何處理BOM文字

下面舉個例子,針對UTF-8的檔案BOM做個處理:

String xmla = 2String(new File("D:projectsmailpostsrc"),"UTF-8");

byte[] b = ytes("UTF-8");

String xml = new String(b,3,th-3,"UTF-8");

Document doc1 = eText(xml);

Element e1 = (Element)ctSingleNode("/ResponseData/Body/RetDesc");

Element e2 = (Element)ctSingleNode("/ResponseData/Head/RespID");

Element e3 = (Element)ctSingleNode("/ResponseData/Body/RetCode");

Element e4 = (Element)ctSingleNode("/ResponseData/Body/RetDesc");

思路是:先按照UTF-8編碼讀取檔案後,跳過前三個字元,重新構建一個新的字串,然後用Dom4j解析處理,這樣就不會報錯了。

其他編碼的方式處理思路類似,其實可以寫一個通用的自動識別的BOM的`工具,去掉BOM資訊,返回字串。

不過這個處理過程已經有牛人解決過了:

  什麼是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.5以及之前的Reader都不能處理帶有BOM的UTF-8編碼的檔案,解析這種格式的xml檔案時,會丟擲異常:Content is not allowed in prolog.

x/UNIX 並沒有使用 BOM,因為它會破壞現有的 ASCII 檔案的語法約定。

不同的編輯工具對BOM的處理也各不相同。使用Windows自帶的記事本將檔案儲存為UTF-8編碼的時候,記事本會自動在檔案開頭插入BOM(雖然BOM對UTF-8來說並不是必須的),但是editplus就不會這樣做。

  BOM與XML

XML解析讀取XML文件時,W3C定義了3條規則:

1.如果文件中有BOM,就定義了檔案編碼;

2.如果文件中沒有BOM,就檢視XML宣告中的編碼屬性;

3.如果上述兩者都沒有,就假定XML文件採用UTF-8編碼。