跳至主要內容
SubtitleMatrix

移除字幕 BOM

文字樣式修正編碼與 BOM
或者貼上字幕文字

選項

BOM 是檔案最開頭的三個位元組,用來說明檔案是哪一種編碼。它在任何編輯器和播放器裡都看不見,不佔畫面空間,加不加它字幕內容都不會變。有兩類工具在意它:寫字幕的 Windows 程式,預設就會寫一個;以及建置流程裡嚴格的解析器,會拒絕帶有 BOM 的檔案。這一頁會按標題點名的狀態開啟這個欄位,所以發現檔案其實是另一種情況時,切換過來即可。UTF-16 檔案總是帶 BOM,因為讀取器靠它判斷自己看到的是兩種位元組順序中的哪一種 —— 在這種檔案上要求移除,它會保持原樣。

時間以哪個影格率計算。在格式頁面上,這是 MicroDVD 需要的值,因為它把時間存成影格編號。在影格率頁面上,它是檔案當初對應的速率 —— 字幕是照這個版本製作的 —— 而頁面的第二個欄位填你要搭配的影片速率。常見的有 23.976、24、25、29.97、30、50、59.94 和 60。填錯會讓整條時間軸位移;在影格率頁面上,位移是按比例發生,而不是固定的量。

BOM 是一個字元 U+FEFF,站在檔案最前面。很多工具會寫它,很多工具不預期它——不預期的那些會把它顯示成黏在第一條字幕開頭的一小串符號。這一頁把它拿掉,其餘一切維持原樣。

最需要移除的場合,是檔案從「給人看」變成「給程式解析」的時候:字幕建置流水線、讀檔案第一行的腳本、規範裡寫明開頭就是第一條字幕第一個字元的格式。拼接檔案時也在乎,因為接好之後中間那個標記就成了字幕中間的一個字元。交付時同樣在乎:你要交的規範寫的是不帶標記的 UTF-8,檢查器就會把標記當成差異。

這一頁不替你做別的決定。字幕編號、時間碼、字幕文字與換行(包括 CRLF)都原樣回來,本來就沒有標記的檔案逐位元組返回,而不是被重寫成等價物。移除標記也不等於改變檔案的字元編碼,兩件事常被混為一談:這一頁只改檔案的第一個字元,其餘部分的編碼一點都沒變。

有一種情況頁面的標題與實際結果會對不上,跑之前值得知道:UTF-16 檔案需要它的標記。沒有標記就分不出兩種位元組序,所以一份不帶標記的 UTF-16 檔案讀不回來。送一份 UTF-16 檔案進來,下載的檔案仍然會帶標記,因為另一個選項是給出一份誰都打不開的檔案。如果你的檔案是 UTF-16 而標記必須拿掉,你要的是換一種編碼,而不是同一種編碼去掉標記;轉換編碼的頁面在下面有連結。

標記是從你下載的檔案上移除的,所以兩欄在這裡可能看起來一模一樣——零寬字元就是看不見的字元該有的樣子。請在編輯器的編碼指示或十六進位檢視器裡確認:沒有標記的檔案,開頭就是第一條字幕的第一個位元組。本站處理的 12 種格式都接受,從 SRT 到純文字轉錄稿;檔案不上傳,讀入、修改、寫出都在瀏覽器裡。

範例

帶標記的檔案,把標記拿掉

輸入

1
00:00:01,000 --> 00:00:02,000
The room is dark.

輸出

1
00:00:01,000 --> 00:00:02,000
The room is dark.

輸入以 U+FEFF 開頭,產物沒有:兩份檔案剛好差那一個字元,這就是整個操作。處於這種狀態的檔案通常來自 Windows 字幕程式,而人們想拿掉標記的原因,是某個建置步驟或嚴格解析器會看開頭位元組而不是看字幕。

Windows 檔案,移除標記但保留回車

輸入

1
00:00:01,000 --> 00:00:02,000
Marked and Windows.

輸出

1
00:00:01,000 --> 00:00:02,000
Marked and Windows.

只拿掉標記。每個回車都是檔案自己的,這一頁對它們沒有意見——兩者都想改的人要的是換行那一頁,把兩件事分開,正是讓每一頁都能安全跑在你沒打開過的檔案上的原因。預期文字仍舊保留它原本的 CRLF。

沒有標記的檔案,逐位元組返回

輸入

1
00:00:01,000 --> 00:00:02,000
The room is dark.

輸出

1
00:00:01,000 --> 00:00:02,000
The room is dark.

沒有東西可移除,所以檔案原樣回來——包括「沒有標記」這件事。這個例子會抓出「先寫標記再剝掉」或「順手正規化」的實作:對「沒有事可做」的誠實讀法就是輸入本身、逐位元組,而不是它整理過的版本。

常見問題

要怎麼判斷字幕檔有沒有 BOM?

用會顯示檔案編碼的編輯器打開,帶標記的 UTF-8 檔通常標成 UTF-8 with BOM 或 UTF-8 BOM,而不是單純的 UTF-8。再不然用十六進位檢視器看開頭位元組:以 EF BB BF 開頭的有,以第一條字幕第一個字元開頭的沒有。第一行開頭那一小串符號,就是讀檔程式把標記當成三個普通字元時看到的同一個東西。

為什麼 UTF-16 字幕檔移除 BOM 之後還留著標記?

因為 UTF-16 檔案需要它。UTF-16 把每個字元存成兩個位元組,兩種位元組序從外面看起來一樣,標記就是告訴讀者是哪一種——不帶標記的 UTF-16 檔案讀不回來,本站或其他任何工具都一樣。這一頁因此保留它。要一份完全沒有標記的檔案,請把編碼改成 UTF-8 或 Windows-1252,那裡的標記是可有可無的。

本來就沒有 BOM 的字幕檔,跑移除 BOM 會改壞嗎?

不會。那種情況的產物就是輸入,逐位元組,而且不會回報任何東西。對狀態不確定的檔案執行這一頁也因此是安全的:沒有標記可移除時就沒有東西要寫,有標記時也只有最小的改動。一次什麼都沒找到的執行,不是一次做了事的執行。

一份字幕檔可能有多個 BOM 嗎?

可能,只要某個工具加標記前沒先檢查就會發生——第二個標記讓檔案在編輯器裡看起來完全正常,開頭位元組卻與正常檔案不同。這一頁會移除全部而不是只移除一個,所以雙標記的檔案一次就清乾淨,再跑一次不會有任何進一步的改變。

移除 BOM 等於改變字幕檔的編碼嗎?

不是大家平常說的那個意思。檔案的文字仍是同一組字元,其餘部分仍以同樣方式編碼;變的是讀者不再有檔案開頭位元組告訴它編碼。不帶標記的 UTF-8 檔案就是普通 UTF-8,多數工具本來也這樣假設。改變編碼本身是另一頁,這裡有連結。

下載字幕檔時,BOM 會回來嗎?

不會。下載就是檔案被寫出的那一刻,這一頁的執行會把它不帶標記地寫出,所以你拿到的就是兩欄描述的東西。檔案寫出的編碼沿用讀入時的編碼,只有一個例外:以 UTF-16 進來的檔案會以 UTF-16 寫回並保留標記,因為那個標記是結構性的,不是裝飾。

相關工具