首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 處理帶 BOM 的文本檔案完整指南

     編輯:Java 相關知識

什麼是 BOM (Byte Order Mark)?

BOM(Byte Order Mark,位元組順序標記)是位於 Unicode 編碼文件開頭的特殊標記,用於識別文件的編碼類型與位元組序(Big-endian 或 Little-endian)。雖然 UTF-8 不強制要求 BOM,但許多 Windows 工具(如記事本)儲存 UTF-8 時會自動插入 BOM(EF BB BF),這在程式處理時常造成不可見的干擾。

常見編碼的 BOM 對照表

BOM (十六進位)對應編碼
EF BB BFUTF-8
FE FFUTF-16 (Big-endian)
FF FEUTF-16 (Little-endian)
00 00 FE FFUTF-32 (Big-endian)
FF FE 00 00UTF-32 (Little-endian)

Java 中手動移除 UTF-8 BOM 範例

早期 JDK(1.5 及之前)無法自動處理帶 BOM 的 UTF-8 檔案,解析 XML 會拋出 Content is not allowed in prolog 異常。常見的手動處理方式是讀取後跳過前 3 個位元組:

String xmla = StringFileToolkit.file2String(new File("D:\\projects\\mailpost\\src\\a.xml"), "UTF-8");
byte[] b = xmla.getBytes("UTF-8");
// 跳過前 3 個位元組 (EF BB BF)
String xml = new String(b, 3, b.length - 3, "UTF-8");
Document doc1 = DocumentHelper.parseText(xml);
// 後續 DOM4J 解析...

通用解決方案:UnicodeReader

手動處理易出錯且不支援多種編碼。社區已有成熟工具 UnicodeReader,可自動偵測並移除各類 BOM,回傳乾淨的字串:

專案網址:https://koti.mbnet.fi/akini/java/unicodereader/

使用方式簡單,只需以 UnicodeReader 取代 InputStreamReader 即可:

Reader reader = new UnicodeReader(new FileInputStream(file), "UTF-8");
// 直接讀取,BOM 已自動移除

不同平台與工具對 BOM 的行為差異

  • Windows 記事本:儲存 UTF-8 時自動加入 BOM。
  • EditPlus / Notepad++:可選擇「UTF-8 無 BOM」儲存。
  • Linux/Unix:傳統上不使用 BOM,避免破壞 ASCII 相容性與 Shell 腳本語法。
  • JDK 1.6+:InputStreamReader 已支援 UTF-8 BOM 自動處理,但舊版專案仍需注意。

XML 標準與 BOM

W3C 規定 XML 解析器判斷編碼優先順序:

  1. 若有 BOM,依 BOM 判定編碼;
  2. 無 BOM 時,讀取 XML 宣告的 encoding 屬性;
  3. 以上皆無,預設為 UTF-8。

因此,產出 XML 時建議「不含 BOM + 明確宣告 encoding」,可最大相容性。

最佳實務建議

  1. 專案統一規範:源碼、設定檔、資料檔一律使用 UTF-8 無 BOM。
  2. 若必須處理外部帶 BOM 檔案,採用 UnicodeReader 或 Apache Commons IO BOMInputStream 統一處理。
  3. 建置流程中加入檢查步驟(如 file -i 或自訂腳本),防止 BOM 混入。

掌握 BOM 特性並採用正確工具,即可避免「不可見字元」帶來的難以除錯問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved