跳到主要内容
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 里它是三个字节 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。

相关工具