打开字幕,中文全变成了「浜戞枡銇傘€嶉」或者「銝曞嫬」这类谁也不认识的字。字幕本身多半没坏,只是编码和读取方式对不上。中文字幕的历史包袱很重:简体中文有 GBK/GB18030,繁体有 BIG5,日文有 Shift-JIS,现代通用的是 UTF-8。
两个字幕站、两代人、两套系统就会产出三种编码。Windows 记事本老版本默认存 ANSI(中文系统=GBK),Mac 工具常存 UTF-8(不带 BOM),日本压制组放的是 Shift-JIS。播放器读的时候如果猜错编码,显示出来就是「正确字节、错误解读」的乱码。
| 乱码样子 | 多半是 | 说明 |
|---|---|---|
| 常见汉字但组合诡异(如「娴嬭瘯」) | UTF-8 被按 GBK 读 | 「测试」的 UTF-8 字节被 GBK 解读 |
| 大片「锟斤拷」 | GBK/UTF-8 转换损坏 | 历史上转坏过一次,难以完全恢复 |
| 「縺ョ繝隱」类日式假名混汉字 | Shift-JIS 被按 UTF-8 读 | 日文字幕配中文字幕名 |
| 「銝 功」类繁体混合 | BIG5 被按 UTF-8 读 | 港台繁体字幕 |
| 部分正常部分 □ 方块 | 字库缺字 | 编码对了,字体缺字形 |
反过来,「正常中文但被当成乱码文件」也常见:GBK 字幕在只认 UTF-8 的播放器里直接显示成方块或问号。
UTF-8 文件常带 BOM(文件开头三个字节 EF BB BF)。用十六进制查看器(或 VS Code 右下角编码显示)看一眼最稳。
VS Code / Notepad++ 右下角点编码,「Reopen with Encoding」依次试 GBK、BIG5、Shift-JIS。哪个能读出正常人话就是哪个——这是最直接有效的笨办法。
chardetect 文件.srt(Python chardet 包)或 file -i 文件.srt(Git Bash 自带)。自动探测对长文本很准,但短字幕(几 KB)会给出低置信度结果,要人工复核。
确定编码后转成 UTF-8 一劳永逸:
iconv -f GBK -t UTF-8 原字幕.srt > 修复字幕.srt
或在 VS Code:用正确编码重新打开 → 右下角 Save with Encoding → UTF-8。
经验提醒:转换前备份原文件。如果猜错了源编码,iconv 转出的结果可能「表面正常、细节丢字」,对照原文件长度(行数应该完全一致)可以快速发现转换事故。
数字管家做字幕编码自动识别时发现:单靠自动探测在真实世界不够用——短字幕置信度低、GBK 和 GB18030 会混淆、个别文件还混着两种编码。最终的方案是三层递进:先信自动探测的高置信结果;低置信时按「文件名语言线索 + 试解码统计常用字频率」二次判断;都不行就给出候选让用户选。识别后转换同样生成派生副本,原字幕永远保留。
上面介绍的 BOM、编辑器切换、iconv 都是手动路子——数字管家把整套探测做成了自动流程。
免费下载,本地运行。收藏了十年的字幕库,一次全部转正。