BOM Remover 會從一串已解碼的文字中,精準地移除一個位於開頭的 U+FEFF 位元組順序標記 (Byte Order Mark),並保留所有內部、結尾或第二個開頭的 U+FEFF 在原本的位置。檢查採用二元方式:測試第一個 UTF-16 碼元是否等於十六進位 FEFF,若是則回傳 input.slice(1),否則原封不動地回傳輸入字串。所有處理都在當前的瀏覽器分頁中進行;貼上的文字絕不會被上傳,也沒有任何外部服務能看到內容。由於此工具是透過 textarea 對已解碼的字元進行操作,因此它無法讀取原始位元組、推斷原始檔案的編碼,或偵測來源檔案是否曾包含 EF BB BF、FE FF、FF FE、00 00 FE FF 或 00 00 00 00 FE FF 的簽章。它依據的是位置而非內容或出現頻率。輸入最多可容納 200,000 個 UTF-16 碼元,輸出則有獨立的 200,000 碼元上限;而編輯輸入內容會清除先前的結果,因此當超過上限發生錯誤時,頁面上不會殘留過時的成功輸出。

如果您搜尋的原因來自《俠盜獵車手 V》的遊戲過程——想找方法從跑車上移除黏性炸彈或引爆車輛——這個工具幫不上忙。GTA V 中車輛、黏性炸彈與個人飛行器的遊戲內行為,與文字編碼毫無關聯,鍵盤上也沒有任何按鍵對應「移除炸彈」的開發指令。真正常發生的,其實是諧音或拼字混淆的情況:有人把 JSON 模組設定檔、輔助程式匯出檔、Social Club 記錄檔或貼上的腳本片段複製到編輯器或剖析器中,結果發現最開頭那個字元是不可見的,導致剖析器拒絕讀取該檔案,或默默誤讀了開頭的語彙,而使用者便將這種症狀描述為「我的文字裡有炸彈」。那個不可見字元幾乎一定是 Unicode 碼位 U+FEFF,而像 BOM Remover 這種刻意設計的精準工具,就是為了從已解碼字串的開頭移除正好一個 U+FEFF,除此之外什麼都不做。

how to remove bomb from car gta 5
如何從 gta 5 車上移除炸彈

為什麼「移除炸彈」的搜尋會落在開發者工具上

搜尋引擎與自動完成功能,並不會清楚地分辨同音異義字。BOM 這個縮寫與「bomb (炸彈)」這個單字只差一個字元,且在大多數發音中聽起來完全相同。開發者若讀到的錯誤訊息開頭是個不可見字元,有時會形容它是「奇怪的開頭字元」、「幽靈位元組」或「檔案開頭的炸彈」,並依此進行搜尋。在這些描述中,真正的元兇幾乎一定是 Unicode 字元 U+FEFF,它的名稱是 ZERO WIDTH NO-BREAK SPACE (零寬不斷行空格),但在已解碼串流的起始位置,根據 WHATWG Encoding 現行標準,它歷史上一直帶有位元組順序標記的語意。

GTA V 本身在正常遊玩過程中,並不會向玩家顯示 U+FEFF。位元組順序標記會出現在與 GTA 相關的使用者自製檔案中:輔助程式的 JSON 設定檔、社群工具匯出的模組清單檔、第三方啟動器的遙測記錄檔,以及複製貼上的 Rockstar 啟動器輸出內容。一個常見的情境如下:

  • 某個輔助程式匯出一個 JSON 檔案,而 PowerShell 的 Get-Content 在讀取時仍帶有 EF BB BF 的 UTF-8 簽章。
  • 該檔案被基礎編輯器存檔,而基礎編輯器保留了該簽章並未將其移除。
  • 使用者將同一段字串貼到網頁驗證器、使用 JSON.parse 的 Node 腳本,或以 shebang 開頭的 Python 原始碼檔案中。
  • 驗證器跳出「Unexpected token (未預期的語彙)」或「Invalid character (無效字元)」的錯誤,因為開頭的 U+FEFF 讓第一個語彙是以不可見標記而非預期的 {#! 開頭。
  • 使用者(本身可能就是 GTA 模組玩家)因此在搜尋框輸入「how to remove bomb from car gta 5」,因為那大致就是那個幽靈字元帶給他們的感受。

BOM Remover 在這個節點上是恰到好處的介入工具,因為它的合約範圍夠小、行為可以預測:最多只會移除一個開頭碼元,而所有其他字元——CRLF 換行、代理對、表情符號、組合附加符號、NUL、後續出現的 U+FEFF,以及非拉丁文字——都會透過精準的切片操作逐位元組保留。不會進行任何 trim、normalize、全域 replaceAll 或正規表示式的處理。

在瀏覽器中從貼上的文字移除開頭的 BOM

介面完全在您的瀏覽器中執行,輸入最多可接受 200,000 個 UTF-16 碼元,且空字串是有效的「無變更」情況。輸出面板則有獨立的 200,000 碼元上限。請依照下列步驟,對含有單一遺留開頭 U+FEFF 的貼上內容進行典型清理。

  1. 將已解碼的文字貼入輸入區,若實際存在不可見的開頭 U+FEFF 也請一併保留。多數瀏覽器會將其呈現為零寬度空白,因此肉眼看不到,但其碼位就位於 JavaScript 字串的位置 0。
  2. 點擊執行按鈕。實作會讀取 input.charCodeAt(0),並將結果與十六進位 FEFF 進行比對——除此之外不會檢查字串的其他部分。
  3. 查看狀態摘要。它會說明是否已移除一個開頭 U+FEFF,或表示未找到,並回報完整輸出在 UTF-16 碼元下的長度。
  4. 檢視完整的輸出面板,包括換行字元、刻意保留的後段 U+FEFF 內容以及其他文字。此次轉換刻意設計為僅執行一次 slice,因此任何您無意失去的內容都會原封不動地保留。
  5. 在本機複製結果。由於剪貼簿存取是非同步的,並由一個世代識別碼保護,因此編輯或清空輸入會使待處理的複製動作失效,而非讓過時的「已複製」狀態殘留在頁面上。

若狀態顯示未找到開頭的 U+FEFF,則輸出面板與輸入完全相同,您不需要將任何內容複製回原始檔案。若狀態確認有進行移除,則變更僅為剛好一個碼元。兩個連續的開頭 U+FEFF 碼元,預設只會被移除第一個;第二個會成為輸出新的第一個字元,此時再執行一次工具即可將其移除。空輸出仍是有效的結果——它單純表示貼上的字串就是一個 U+FEFF,而現在正確地變成空字串。

在邊界情況下的輸入與輸出行為

此工具的轉換規則雖然簡單卻很精確,下表說明了每一個經正式測試的輸入模式的處理方式。這些數值取自實作的執行測試,而非從類別常規推測而得。

輸入模式執行後的輸出狀態摘要
U+FEFF 後接 "Hello""Hello"已移除一個開頭 U+FEFF
"Hello" 無開頭 BOM"Hello"未找到開頭 U+FEFF
"He" + U+FEFF + "llo""He" + U+FEFF + "llo"未找到開頭 U+FEFF
"Hello" 含結尾 U+FEFF含結尾 U+FEFF 的 "Hello"未找到開頭 U+FEFF
U+FEFF + U+FEFF + "Hi"U+FEFF + "Hi"已移除一個開頭 U+FEFF
空字串空字串無變更情況,有效
僅有單一 U+FEFF空字串已移除一個開頭 U+FEFF
"Line1\r\n" + U+FEFF + "Line2""Line1\r\n" + U+FEFF + "Line2"未找到開頭 U+FEFF

從這些範例中可以歸納出幾項值得強調的細節。第一,結果面板永遠會顯示,包括輸出為空的情況——對僅含 BOM 的輸入而言,空面板代表轉換成功,而非表示缺少或失敗。第二,CRLF 與 LF 換行、文字中的 NUL 位元組、代理對、表情符號、含腔調字元以及組合附加符號,都會透過切片操作原樣保留。第三,摘要中回報的輸出長度,是最終字串以 UTF-16 碼元計算的長度,而這與上限檢查使用的單位相同,因此恰好等於上限的輸入會被接受,比上限多 1 的輸入則會在處理前被拒絕。第四,瀏覽器可能會視覺上將某些不可見字元在 textarea 中顯示為正常,但邏輯所產生的 JavaScript 字串,就是原始字串減去最多一個開頭的 U+FEFF 碼元。

限制、編碼與本工具不做的事

BOM Remover 圍繞著一條規則運作,而這種狹隘性正是它的價值所在。它不會移除所有零寬度字元、不會進行 Unicode 正規化、不會修剪空白、折疊換行字元或重寫引號。它根本不會檢視原始檔案,因為瀏覽器的 textarea 已經包含已解碼的字元,而非解碼器通常會處理的位元組簽章。編碼偵測與簽章處理屬於解碼器的責任,而非解碼後文字工具的工作;WHATWG Encoding 現行標準已明確劃分此一界線。

輸入 200,000 碼元的上限與輸出的獨立上限,都是經過刻意設計的。由於唯一的轉換是移除零或一個碼元,因此有效輸入在處理過程中不會膨脹,但輸出邊界仍會被明確檢查以維持不變式。編輯或清空輸入會立即清除先前的結果、錯誤訊息、移除旗標、複製確認以及任何待處理的剪貼簿計時器——因此超過上限的錯誤不會在頁面上留下過時的成功結果。一旦複製請求因其他使用者動作而失效,延遲回應的剪貼簿權限也無法還原「已複製」狀態;而被拒絕的請求則會保留完整唯讀的輸出供手動選取。

基於這些原因,BOM Remover 並不能用來取代在檔案載入階段選擇具有正確 BOM 政策的解碼器。若您能設定 PowerShell、iconv、Node 的 fs.readFileSync(搭配正確編碼)或編輯器的存檔對話方塊,使其在寫入時抑制 BOM,那才是更乾淨的處理方式。當可信賴的解碼器已經在 textarea 內暴露了開頭的 U+FEFF,且該碼位正干擾剖析器、比較、JSON 解析、shebang 行、CSV 表頭或需要讓第一個字元完全不同的欄位名稱時,才該使用 BOM Remover。

When BOM Remover Fits vs. Other Approaches

The tool earns its place in a developer's workflow in a small number of recognizable situations, and three concrete triggers cover most of them.

  • You pasted a JSON file from a Windows PowerShell Get-Content call into a web validator, and the first token silently becomes U+FEFF instead of {, producing a parser error at line 1 column 1.
  • You copied a CSV header from an export into a script, and the first column name no longer equals the same string without a leading BOM, breaking a join key or a header-driven lookup.
  • You saved a Python or Node source file starting with a UTF-8 BOM, and a shebang line is being ignored or a documentation tool is misinterpreting the first character of the file.
  • You need to compare two decoded strings for byte equality and one of them carries a BOM that the other does not, so a naive equality check fails despite the visible content matching.

For text pasted from a different enterprise system, a separate guide describes the same cleanup operation in that specific SAP workflow. For file-level stripping on Windows .csv or .txt files that contain a UTF-8 BOM you want to remove at the byte level rather than the decoded level, a different approach is more appropriate. For typical in-browser handling of decoded text where the leading U+FEFF is the only thing standing between you and a successful parse, though, BOM Remover's narrow contract — one leading code unit removed, everything else preserved, no upload, no asynchronous surprises — is exactly the shape of intervention the situation needs.

For a deeper look, see CSS Text Shadow Generator Alternative for Auditable Output.