將檔案轉換為 UTF-8 且不含位元組順序記號 (BOM),意即產生乾淨的 UTF-8 位元組,且在輸出中不會寫入 0xEF 0xBB 0xBF 前綴,即使來源檔案原本含有該前綴。UTF-8 轉換器會在您的瀏覽器中本地處理此轉換:它會以嚴格錯誤檢查解碼您選擇的來源位元組,消耗來源所宣告的任何前置 BOM,然後將解碼後的字元重新編碼為 UTF-8,且不會再加回 BOM。這是針對原始碼、設定檔以及許多 CSV 管線的標準建議做法,因為多餘的 BOM 會在未預期處出現幽靈字元 — 例如匯入 CSV 的第一個欄位標頭、JSON 文件的開頭,或腳本的前三個位元組。此工具支援四種來源編碼 — UTF-8、UTF-16 little-endian、UTF-16 big-endian 以及 Windows-1252 — 而且它要求您必須明確選擇其中一種,而非自動猜測。

含 BOM 與不含 BOM 的 UTF-8 實際上代表什麼
UTF-8 是網路上以及現代作業系統中主流的文字編碼。Unicode 標準並不要求 UTF-8 必須包含位元組順序記號 — UTF-8 具備固定的位元組順序,因此 BOM 並不像在 UTF-16 中那樣承載端序資訊。當檔案最開頭出現 0xEF 0xBB 0xBF 這三個位元組時,它們代表「這是 UTF-8」,但任何符合規範的解碼器也必須接受不含該前綴的 UTF-8。
某些應用程式預設會將 UTF-8 檔案連同 BOM 一起儲存。Windows 版的 Notepad 尤其如此,過去一向會寫入 UTF-8 BOM,除非另行指定;某些 CSV 匯出工具也採取相同做法,以便試算表程式能順利開啟檔案。問題在於,期待純粹 UTF-8 的工具會將這三個位元組視為第一個字元的一部分。字串 "name" 在解析後可能會變成 "\ufeffname",CSV 的第一個欄位標頭會變成 "\ufeffname",而 shell 腳本在 shebang 應為檔案第一行時,會因前置位元組而發生錯誤。這正是為什麼 RFC 3629 對 UTF-8 的定義 建議除非通訊協定明確要求,否則不應使用 BOM。
因此「轉換為 UTF-8 BOM」有兩種截然不同的意義,且會產生相反的結果。若您的目的地需要 BOM — 例如會檢查 0xEF 0xBB 0xBF 的下游解析器 — 您要的是以這三個值開頭的位元組。若您的目的地期待純粹的 UTF-8 — 例如原始碼儲存庫、JSON 消費者、大多數 Linux 工具 — 您要的是完全沒有前綴。UTF-8 轉換器鎖定的就是第二種情況:它會移除已辨識的 BOM,且絕不會再寫入新的 BOM。
在轉換前選擇正確的來源編碼
任何編碼轉換中最困難的部分,是辨識最初的位元組是由什麼所產生。大多數現代應用程式都會記錄其預設值 — Windows 上的 Visual Studio 過去會以含 BOM 的 UTF-16 寫入,Notepad 仍預設使用含 BOM 的 UTF-8,Java 原始碼檔案通常輸出為不含 BOM 的 UTF-8 — 而這份說明文件是最可靠的答案。在猜測之前,請在產生該檔案的應用程式設定或檔案自身的元資料中,尋找「編碼」、「字元集」或「預設儲存格式」等字樣。
| 來源編碼 | 常見產生來源 | BOM 處理方式 |
|---|---|---|
| UTF-8 | 大多數現代編輯器、網頁匯出、Linux 工具 | 消耗前置 BOM,輸出不含 BOM |
| UTF-16 little-endian | Windows Notepad「Unicode」、部分 Java 與 .NET 串流 | 辨識並移除相符的 BOM |
| UTF-16 big-endian | 網路位元組順序匯出、部分 Unix 封存檔 | 辨識並移除相符的 BOM |
| Windows-1252 | 舊式西歐文字,常被誤標為 ISO-8859-1 | 無 BOM 概念;位元組重新編碼為 UTF-8 |
位元組序列可能同時符合多種舊式編碼,卻代表不同的字元。位元組 0x80 在 Windows-1252 中代表「€」,但在 ISO-8859-1 中未定義;同一個位元組若出現在 UTF-16 串流中,則會屬於某個雙位元組碼元的一部分。因此,自動猜測的結果看似合理,卻仍可能損壞姓名、標點或符號。明確選擇可讓轉換過程保持可稽核:您可以指著來源應用程式說「就是它寫出這個檔案」,然後將預覽結果與已知正確的樣本進行核對。
使用瀏覽器工具將檔案轉換為不含 BOM 的 UTF-8
- 辨識來源編碼。請檢查產生該檔案的應用程式、平台的預設儲存格式,或任何可靠的元資料。不要僅依賴字形的目視判斷 — 許多編碼在遇到姓名、引號或貨幣符號之前,看起來都很正常。
- 開啟 UTF-8 轉換器並選擇對應的來源編碼。根據您所確認的內容,從編碼選擇器中挑選 UTF-8、UTF-16LE、UTF-16BE 或 Windows-1252。載入檔案後再切換選擇器會重置預覽,因此請先設定好選擇器。
- 選擇大小不超過 10 MB 的文字檔。大小會在讀取檔案前先進行檢查,因此意外過大的檔案會在載入前就被拒絕。數 GB 的記錄檔與資料庫傾印檔應改用串流工具。
- 進行轉換並檢查預覽。瀏覽器會以 WHATWG 標籤搭配嚴格錯誤處理來解碼位元組,因此格式錯誤的 UTF-8 序列會明確失敗,而不會產生替換用的方框。在您信任結果之前,請檢查具代表性的姓名、標點、貨幣符號以及任何非 ASCII 的行。
- 下載轉換後的檔案。輸出會以本地 Blob URL 形式提供,其媒體類型為 UTF-8,且檔名以 -utf8 結尾。下載的位元組不含 BOM,因此該檔案可直接用於期待純粹 UTF-8 的原始碼儲存庫、JSON 消費者及 Linux 工具。
- 在目的端應用程式中測試結果。請在實際會使用該檔案的地方開啟下載檔案 — IDE、資料管線、網頁伺服器 — 並確認預覽結果一致。在完整工作流程驗證完成前,請保留原始檔案。
解讀預覽以抓出編碼錯誤
預覽是最便宜能抓出錯誤編碼選擇的地方。請挑選您在來源中已了解的內容 — 含有變音符號的客戶姓名、含花式引號的句子、含歐元符號的資料列 — 並與您預期的結果進行比對。若花式引號變成了直引號,幾乎可以確定您選錯了字碼頁。若表情符號顯示為兩個方框字符,您很可能是為 UTF-16 來源選了單位元組編碼。頁面也會回報來源與輸出的位元組數量;兩者不同屬於正常現象,單憑這點並不代表資料遺失,因為對於 U+007F 以上的字元,UTF-8 使用的位元組數會比 Windows-1252 多。
以下是一個具體的逐步範例,說明重新編碼的過程。以 Windows-1252 位元組 0x80 為例,依標準定義的 Windows-1252 解碼器,它會對應到歐元符號 U+20AC。在嚴格解碼下,該單一位元組會成為 Unicode 純量值 U+20AC,接著 UTF-8 編碼器會將其寫為 0xE2 0x82 0xAC 三個位元組。因此,Windows-1252 檔案中佔 1 個位元組的歐元符號,在 UTF-8 檔案中會變成 3 個位元組:1 → 3 位元組,這是一種正確的擴展,並非損壞。
在目的端應用程式中驗證下載的檔案
一旦轉換後的檔案存到磁碟,在您完成測試之前,請將它視為候選檔案。請在日常會讀取它的應用程式中開啟,並執行一次健全性檢查:能成功編譯的建置、能成功匯入的資料庫、能產生正確標頭的 CSV 匯入、不會拒絕第一個位元組的 JSON 解析器。若您負責維護原始碼,請執行專案既有的測試套件 — 隱而不顯的編碼錯誤常常會以單一失敗的斷言形式出現,而且往往是字串比對失敗,位置卻遠離真正變動的那個位元組。
以 -utf8 結尾的檔名可讓您在驗證期間同時保留原始檔案與新檔案。一旦您確認工作流程正確無誤,便可將原始檔案退役。對於特別需要含 BOM 之 UTF-8 的 Notepad 使用者而言,本轉換器並不會再加回 BOM;在那種情況下,Notepad 專屬的工作流程 涵蓋了相反的處理方式。針對 Windows 層級的檔案關聯,Windows 編碼指南 則會逐步說明更廣泛的系統設定。
何時串流工具是更好的選擇
10 MB 的上限之所以存在,是因為轉換器在解碼與重新編碼時,會將整個檔案保留在記憶體緩衝區中。對於一般的原始檔、設定資料、CSV 匯出檔以及小型記錄檔而言,該上限相當充裕。對於數 GB 的記錄檔封存、資料庫傾印檔或媒體字幕檔,您需要的是一種串流式轉換器,它能讀取來源位元組並寫入目的地位元組,而無須將整個檔案保留在 RAM 中。請挑選仍要求您明確指定來源編碼的工具 — 相同的可稽核原則同樣適用 — 並且該工具應能回報進度,讓您及早發現卡住的工作。
此轉換器的定位刻意相當狹窄:實際的檔案位元組、四種宣告的來源編碼之一、嚴格的驗證、以及不含 BOM 的可下載 UTF-8 產出物。它不會啟發式地偵測編碼、不會修復亂碼 (mojibake)、不會正規化 Unicode、不會翻譯語言,也不會變更行尾符號,除非是因解碼為字元再重新編碼為 UTF-8 而自然產生。對於該範圍之外的所有需求 — 含 BOM 的輸出、自動偵測、亂碼修復、額外的正規化 — 請改用合適的專用工具,而非期待單一公用程式能涵蓋所有編碼工作。