字幕添加 BOM
或者粘贴字幕文本
选项
BOM 是文件最开头的三个字节,用来说明文件是哪种编码。它在任何编辑器和播放器里都不可见,不占屏幕空间,加不加它字幕内容都不会变。有两类工具在意它:写字幕的 Windows 程序,默认就会写一个;以及构建流水线里严格的解析器,会拒绝带有 BOM 的文件。这一页会按标题点名的状态打开这个框,所以发现文件其实是另一种情况时,翻过来即可。UTF-16 文件总是带 BOM,因为读取器靠它判断自己看到的是两种字节序中的哪一种 —— 在这种文件上要求移除,它会保持原样。
时间按哪个帧率计算。在格式页面里,这是 MicroDVD 需要的值,因为它把时间存成帧号。在帧率页面里,它是文件当初对应的速率 —— 字幕是按这个版本做的 —— 而页面的第二个框填你要拿它配套的视频速率。常见的有 23.976、24、25、29.97、30、50、59.94 和 60。填错会让整条时间轴偏移;在帧率页面里,偏移是按比例发生的,而不是一个固定的量。
BOM 是一个字符——U+FEFF,站在文件最前面。在 UTF-8 里它是三个字节 EF BB BF,也是读者最先看到的东西。这一页的产物看上去什么都没变:同样的 cue、同样的时间码、同样的换行,只是最前面多了一个标记。
为什么要加:这个标记是文件在不说话的情况下声明“我是 UTF-8”的方式。打开字幕文件的程序得猜它是什么编码,而相当多的程序——旧的 Windows 播放器、光盘制作工具、只读第一行的脚本——靠看开头几个字节来判断,而不是解析整份文件。给它们标记,带重音的名字、弯引号、希腊字母才能原样显示;不给,同一份文件可能被按系统的本地代码页读,那些字符就变成了别的东西。
反方向才是多数人先遇到的:文件有标记,而工具不预期它,于是把三个字节读成三个字符,印在第一行行首——别人字幕文件顶上那一小串符号就是这么来的。如果你面对的是这种情形,你需要的是移除 BOM,而不是添加。
这一页不会顺手重排文件:CRLF 换行、cue 编号、时间、任何一行文字都不动,也不替你决定文件编码(那不是 UTF-8 的文件是另一个问题,另有其页)。如果标记已经存在,它会先把原有的去掉再写一个,所以跑两遍与跑一遍结果相同。12 种格式都能携带 BOM,因为标记是文件开头字节的属性,与 cue 无关;文件不上传。
示例
一份 ASCII 字幕文件,前面加上标记
输入
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.
预期文本以一个不可见字符开头:U+FEFF、三个字节 EF BB BF,在第一个 cue 编号的 1 之前。两栏看起来一样不是渲染错误——差别只有三个字节,而它们都没有形状。用十六进制查看器看开头,或看编辑器的编码指示。
一份 Windows 文件:加标记,保留回车
输入
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.
Windows 字幕工具常同时写标记和 CRLF,所以两者常被混为一谈,但它们分开:这一页只写前一个。预期文件里每个回车都是输入自带的,标记加在它们之前;顺手改换行符会让每份经手的文件被静默重排。
常见问题
给字幕文件加 BOM 到底改变了什么?
只在最前面多一个字符 U+FEFF,UTF-8 下写作三个字节 EF BB BF。没有 cue 被增删或改写,时间码不动,编号与换行原样,每行文字不变;两份文件逐行对比只有第一行不同。
加 BOM 会改变文件原来的换行符吗?
不会。LF 还是 LF,CRLF 还是 CRLF,混合换行的文件出来还是同样的混合。改换行符是另一页的事,让一页悄悄做两件事是坏主意。
已经带 BOM 的文件再加会变成两个吗?
不会。页面先移除已有的标记再写自己的,所以带标记的文件原样返回、不带标记的得到恰好一个;连跑两次与跑一次相同。已经被别的工具加了两个标记的文件,也能靠跑一次清成一个。
加完 BOM 再转成别的格式,标记还在吗?
本站的转换页写的是不带标记的纯 UTF-8,所以不会保留。顺序要安排成先转换、最后再在交付前加标记——标记属于成品文件,不属于字幕内容。
哪些字幕格式可以加 BOM?
本站处理的 12 种都可以:SRT、WebVTT、ASS、SSA、SBV、SAMI、LRC、MicroDVD、TTML、JSON、CSV 与纯文本。标记是文件开头字节的属性,连没有时间轴的纯文本转录稿也能带。
页面上下两栏看起来一模一样,怎么确认加上了?
U+FEFF 是零宽字符,按播放器的方式渲染当然看不出差别。改动在下载的文件里:编码指示器显示 UTF-8 with BOM,或者十六进制查看器开头是 EF BB BF。