跳到主要内容
SubtitleMatrix

移除字幕 BOM

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

选项

BOM 是文件最开头的三个字节,用来说明文件是哪种编码。它在任何编辑器和播放器里都不可见,不占屏幕空间,加不加它字幕内容都不会变。有两类工具在意它:写字幕的 Windows 程序,默认就会写一个;以及构建流水线里严格的解析器,会拒绝带有 BOM 的文件。这一页会按标题点名的状态打开这个框,所以发现文件其实是另一种情况时,翻过来即可。UTF-16 文件总是带 BOM,因为读取器靠它判断自己看到的是两种字节序中的哪一种 —— 在这种文件上要求移除,它会保持原样。

时间按哪个帧率计算。在格式页面里,这是 MicroDVD 需要的值,因为它把时间存成帧号。在帧率页面里,它是文件当初对应的速率 —— 字幕是按这个版本做的 —— 而页面的第二个框填你要拿它配套的视频速率。常见的有 23.976、24、25、29.97、30、50、59.94 和 60。填错会让整条时间轴偏移;在帧率页面里,偏移是按比例发生的,而不是一个固定的量。

BOM 是一个字符 U+FEFF,站在文件最前面。很多工具会写它,很多工具不预期它——不预期的那些会把它显示成粘在第一条 cue 开头的一小串符号。这一页把它取下来,其余一切原样。

最需要移除的场合,是文件从“给人看”变成“给程序解析”的时候:字幕构建流水线、读文件第一行的脚本、规范里写明开头就是第一条 cue 第一个字符的格式。拼接文件时也在乎,因为拼好后中间那个标记就成了 cue 中间的一个字符。交付时同样在乎:规范写的是不带标记的 UTF-8,检查器就会把标记当成差异。

这一页不替你做别的决定。cue 编号、时间码、cue 文字与换行(包括 CRLF)都原样回来,本来就没有标记的文件逐字节返回,而不是被重写成等价物。移除标记也不等于改编码,两件事常被混为一谈:这一页只改文件的第一个字符,其余部分的编码一点没变。

有一种情况页面的标题与结果会对不上,跑之前值得知道:UTF-16 文件需要它的标记。没有标记就分不出两种字节序,一份不带标记的 UTF-16 文件读不回来。所以 UTF-16 文件跑过这一页,下载下来的仍然带标记,因为另一种做法是给出一份谁都打不开的文件。UTF-16 又必须去标记时,要的是换一种编码,而不是同一种编码去掉标记。12 种格式都接受,文件不上传;零宽字符本来就看不出,去编辑器状态栏或十六进制查看器确认:没有标记的文件以第一条 cue 的第一个字节开头。

示例

带标记的文件,标记被取下

输入

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.

只去掉标记。每个回车都是文件自己的,这一页对它们没有意见——想两样都改的是换行符那一页,把两件事分开才让每一页都能安全地跑在没打开过的文件上。

常见问题

怎么判断字幕文件有没有 BOM?

用显示编码的编辑器打开,带标记的 UTF-8 通常标成 UTF-8 with BOM 或 UTF-8 BOM,而不是单纯的 UTF-8;或者看开头字节:以 EF BB BF 开头就是有。第一行行首那串符号是同一个东西被当成三个普通字符读出来的样子。

为什么 UTF-16 文件去完标记还留着?

因为 UTF-16 需要它。每个字符两个字节,两种字节序从外面看不出区别,标记就是告诉读者用哪一种——不带标记的 UTF-16 文件谁都不读回来,本站也不行。真要一个没有标记的文件,请把编码改成 UTF-8 或 Windows-1252。

本来就没有 BOM 的文件会被改坏吗?

不会。那种情况下输出就是输入,逐字节一致,也不会报任何改动。对一个状态不明的文件跑这一页在构造上是安全的:没标记可去就什么都不写,有标记就去掉最小的那一个字符。

一个字幕文件可能有两个 BOM 吗?

可能,凡是工具在加标记前没检查就会发生:编辑器里看着完全正常,开头字节却和普通文件不同。这一页移除的是全部而不是一个,双标记的文件一次就清干净,再跑一遍不会有任何变化。

去掉 BOM 等于改变字幕的编码吗?

不是通常说的那种改变:文字还是同样的字符,其余部分仍按原编码存储,变的是“读者不再从开头字节得知编码”。不带标记的 UTF-8 就是普通 UTF-8,多数工具本来也这么假设。要换编码是另一页。

下载得到的文件真的没有标记吗?

真的没有。下载那一刻才写文件,这一页写出的不带标记。唯一的例外是 UTF-16 输入:它按 UTF-16 写回并保留标记,因为那个标记是结构性的,不是装饰。

相关工具