跳到主要内容
SubtitleMatrix

字幕换行符转换

文本样式修正编码与 BOM
或者粘贴字幕文本

选项

文件里每行结尾要么是一个不可见字符(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 切分文件、结果最后一个字段粘着回车的工具;以及任何点名了其中一种的交付规范。要拿去和别人 diff、或者要和别的文件拼接的字幕,换行符就是它接口的一部分。

这一页对产物的处理刻意统一:混合换行的文件——有的行因为 Windows 编辑过是 CRLF、有的行因为别处编辑是 LF——出来全部是你选的那种,因为页面先把换行统一成 LF 再套用你的选择。这不是“把已经对的行转换、其余不动”,而是让“这份文件是哪种换行”这个问题的答案不再取决于你看哪一行。

老 Mac(OS X 之前)那种单独的 CR 也一并处理:现在没人主动选它,但文件仍然会遇到,而按 LF 读的工具会把整份文件当成一行。先统一再转换,这类文件才不会变成一个巨大的 cue。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.

每个换行都变成两个字符,包括两条 cue 之间那个空行——空行也是一行,跳过它就会留下一个仍是裸 LF 的 cue 分隔符。预期文本把换行写成 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 流水线里则表现为最后一个字段末尾粘着回车。两份文件画面、时间、文字都一样,差别是每行末尾那个字符。

常见问题

LF 和 CRLF 分别是什么字节?

LF 是一个字节 0A,CRLF 是 0D 0A 两个字节。看行尾字节是最直接的判断;多数编辑器的状态栏也会写 LF、CRLF 或混合。

混合换行的文件会被怎么处理?

先统一成 LF 再转成你选的那种,所以结果完全一致,而不是一部分被转、一部分没转。混合通常来自多台机器上的编辑,它正是让 diff 没法读的原因。

字幕之间的空行也会跟着换吗?

会。空行也是一行,它的结尾就是普通的换行。SRT 用空行分隔 cue,如果分隔符还是裸 LF,文件里就混着两种换行——正是这一页要消除的混合。文件最后一行同理。

老 Mac 的单独 CR 换行会处理吗?

会。以单独 CR 结尾的文件与其它文件一起被统一,出来是你选的那种,而不是被当成一行。面板上没有 CR 选项,因为现在没人那样写文件,但已经是那样的文件会被正确读入并写出。

换行符转换会动时间码或字幕文字吗?

不会。cue、编号、起止时间和文字前后完全一致,变的只是每行末尾的一到两个字符。播放器读两份文件的方式相同,所以这是可以放心为交付要求做的转换。

应该选 LF 还是 CRLF?

面前没有东西点名 CRLF 就选 LF:Unix 工具、多数构建流水线和 WebVTT 规范都期望它,而且每行还少一个字节。交付规范或纯 Windows 工具要求时才选 CRLF,注意这是逐文件的选择。

相关工具