字幕換行字元轉換
或者貼上字幕文字
選項
檔案裡每一行的結尾要不是一個看不見的字元(LF),就是兩個(CRLF)。播放器、編輯器和字幕工具都能讀這兩種,所以它幾乎從來不是字幕檔案出問題的原因 —— 會造成問題的兩種情況是:建置流程或嚴格解析器拒絕其中一種,以及 diff 工具因為換行字元不同而把每一行都顯示成已變更。這裡預設選 LF,因為 Unix、macOS 和 Web 都用它,而且已經是 LF 的檔案不會被改動。選 CRLF 會同時轉換兩種既有的換行字元,所以混用的檔案也會變得一致。
時間以哪個影格率計算。在格式頁面上,這是 MicroDVD 需要的值,因為它把時間存成影格編號。在影格率頁面上,它是檔案當初對應的速率 —— 字幕是照這個版本製作的 —— 而頁面的第二個欄位填你要搭配的影片速率。常見的有 23.976、24、25、29.97、30、50、59.94 和 60。填錯會讓整條時間軸位移;在影格率頁面上,位移是按比例發生,而不是固定的量。
換行字元是結束一行的字元或字元對,常見的有兩種:Unix 用一個字元 LF,Windows 用兩個,CR 再 LF。螢幕上看起來一樣,字幕播放器讀起來也一樣,所以這是那種直到下游在乎之前都看不見的差別。
會在乎的有:版本控制,一份檔案的每一行都可能顯示成被改過;建置腳本與流水線,剝掉行尾字元時預期換行卻拿到多餘的回車;按 LF 切檔、結果最後一個欄位黏著回車的工具;以及任何點名其中一種的交付規範。要拿去跟另一份比對、或要跟別的檔案拼接的字幕,換行就是它介面的一部分。
這一頁對產物的處理刻意統一。混合換行的檔案——有的行因為在 Windows 編輯過是 CRLF、有的行因為在別處編輯是 LF——出來全部是你選的那種,因為頁面先把換行統一成 LF,再套用你的選擇。這不是「把已經正確的行轉換、其餘不動」,而是讓「這份檔案是哪種換行」這個問題的答案不再取決於你看哪一行,而那才是對腳本有用的答案。
老 Mac(OS X 之前)那種單獨的 CR 也一併處理。現在沒人主動選它,但檔案仍然會遇到,而只找 LF 的工具會把整份檔案當成一行。先統一再轉換,這類檔案才不會變成一個巨大的字幕段落。
這一頁的兩欄是這個家族裡唯一能直接看出差別的地方:換行是真的字元,在不隱藏控制字元的檢視器裡看起來每行之間多空一行的檔案,就是 CRLF。12 種格式都接受,因為換行是文字的屬性而不是字幕格式的屬性——純文字轉錄稿也有行。檔案不上傳,讀入、修改、寫出都在瀏覽器裡。
範例
把 Unix 檔案轉成 Windows 換行
輸入
1
00:00:01,000 --> 00:00:02,000
The room is dark.
2
00:00:03,000 --> 00:00:04,000
A cold night.
輸出
1
00:00:01,000 --> 00:00:02,000
The room is dark.
2
00:00:03,000 --> 00:00:04,000
A cold night.
每個換行都變成兩個字元,包括字幕之間的空行——那個空行也是換行,跳過它的轉換會留下一個字幕分隔仍是單獨 LF 的檔案。預期文字把換行寫成 CR LF 對,讓數量可以直接讀出來,檔案裡其他東西都沒有移動。
把 Windows 檔案轉回 Unix 換行
輸入
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.
有可見後果的那個方向。留著多餘回車的檔案,在某些編輯器裡每行後面會多一個空行,在 shell 流水線裡則是回車黏在最後一個欄位尾端。影片、時間與文字在兩份檔案裡完全相同;差別是每行結尾的一個字元,而這個方向把它拿掉。
在兩台機器上編輯過的檔案,統一格式
輸入
1
00:00:01,000 --> 00:00:02,000
Mixed endings.
2
00:00:03,000 --> 00:00:04,000
Second.
輸出
1
00:00:01,000 --> 00:00:02,000
Mixed endings.
2
00:00:03,000 --> 00:00:04,000
Second.
同一份檔案在兩台機器上碰過:有些行以 CRLF 結尾、有些以 LF,還有一個字幕分隔兩種寫法都有。產物是統一的,這就是重點——檔案不再取決於你讀哪一行而有不同意思。天真的尋找取代在兩個方向都會做錯:一個方向放過 LF 的行,另一個方向產生重複的回車。
常見問題
LF 和 CRLF 分別是什麼位元組,怎麼看出字幕檔用哪種?
在編輯器裡通常看狀態列的 LF、CRLF 或混合。從 shell 看,以 CRLF 結尾的檔案在會顯示控制字元的工具裡,每行尾端會多一個回車。最直接的測試是看行尾位元組:單一個 0A 是 LF,0D 0A 這一對是 CRLF。
字幕換行轉換對混合換行的檔案會怎麼處理?
會把它們全部統一。檔案先被正規化為 LF,再轉成你選的樣式,所以有的行一種、有的行另一種的檔案,出來完全一致,而不是只轉了一部分。檔案會落到這種狀態,通常是因為在多台機器上編輯過,而這種混合正是讓它與另一份副本的差異比對無法閱讀的原因。
換行符轉換會動到字幕時間或字幕文字嗎?
不會。字幕、編號、起止時間與其中的字,前後完全相同;變的只是每行結尾的一或兩個字元。播放器讀兩份檔案的方式一樣,所以這是可以為了交付要求去做、而不必擔心字幕本身的轉換。
應該選 LF 還是 CRLF?
除非面前有東西點名 CRLF,否則選 LF。這是 Unix 工具、多數建置流水線與 WebVTT 規範預期的,而且每行少一個位元組。當交付規範或只做 Windows 的工具要求時選 CRLF,並注意這個選擇是逐份檔案而不是全域的:單獨交付的字幕可以跟專案其他檔案不同。
為什麼轉成 CRLF 連字幕之間的空行也跟著變?
因為那個空行也是一行,它的結尾就是換行。SRT 用空行分隔字幕,所以轉成 CRLF、字幕分隔卻仍是單獨 LF 的檔案,會在一份統一的檔案中間留下一種不同類型的換行——而那正是這一頁要移除的混合。檔案的最後一行也一樣。
老 Mac 的回車換行也會一起轉換嗎?
會。行尾是單獨回車的檔案(OS X 之前 Mac OS 的樣式)也會一起被正規化,所以會以你選的樣式出來,而不是維持成一個很長的字幕段落。面板上沒有 CR 選項,因為現在沒人那樣寫檔案,但已經是那樣的檔案會被正確讀入與改寫。