java如何處理BOM文本
説起BOM,這個疑問還比擬費事,由於BOM不可見,但用順序做不一樣編碼文本處置時分卻經常須要思索到BOM的疑問。在此之前,先對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編碼。
-
計算機二級Java備考習題及答案
練習可以幫助我們加深對知識的記憶和理解,下面是本站小編整理的2017計算機二級Java備考練習題及答案,歡迎學習!備考練習題一1、下列敍述中,錯誤的是______。A、Applet的默認佈局管理器是FlowLayoutB、JApplet中增加構件是加到JApplet的內容面板上,不是直接加到JApp...
-
Java中運算符的使用
導語:計算機的最基本用途之一就是執行數學運算,作為一門計算機語言,Java也提供了一套豐富的運算符來操縱變量。下面是java中運算符的使用,一起來學習下吧:算術運算符單目:+(取正)-(取負)++(自增1)--(自減1)雙目:+-*/%(取餘)三目:a>b?true:false説明:當a大於b的時候,為tru...
-
Java創建線程的三種方法
導語:編寫多線程程序是為了實現多任務的併發執行,從而能夠更好地與用户交互。下面是Java創建線程的三種方法,一起來學習下吧:Runnable和Callable的區別(1)Callable規定的方法是call(),Runnable規定的方法是run().(2)Callable的任務執行後可返回值,而Runnable的任務...
-
java與JavaScript語言有何不同
java和JavaScript是兩個不同的語言。那麼這兩個語言有什麼不同呢?下面本站小編帶大家一起來看看詳細內容,希望對大家有所幫助!想了解更多相關信息請持續關注我們應屆畢業生考試網!講個故事:話説很久很久以前,有一個叫網景(Netscape)的,十月懷胎,他生了個兒子,很開興,...