识幕 SeeSub — 一站式字幕工作台: https://seesub.com/

上周末发布了一个做字幕相关的 App,叫做“识幕”。发布以来广受好评,但同样也反馈了很多 bug。
其中一个 bug 是,明明模型就在指定目录里。目录名字和位置都正确,里面的模型文件也是存在的,但程序就是死活找不到该文件。

因为我这个应用是在 macOS 上开发的,然后在 Windows 环境下打包 Windows 的可执行文件,所以我 Windows 测得并不是很多。
但我一看这个截图大概就知道,应该就是 Windows 路径名出现汉字的原因。于是我赶紧趁周末修复了这个问题,并新增了一些新功能,发布了 0.4.0 的版本。
这其实是 Windows 上一个很经典又很烦人的老问题。
不是 Windows 不认识中文,而是很多桌面软件还在用老一套办法处理文字。
简单说,Windows 内部其实一直用 Unicode(宽字符)存文件名,这套是原生支持中文的。但为了兼容很早以前的老程序,系统接口大多提供了两套:
-
…A 版本(ANSI):接收“窄字符”字符串。这种字符串本身没有自解释的编码信息,其含义完全取决于当前系统的“活动代码页”(Active Code Page)。在简体中文Windows上,这个代码页通常是 936(即GBK)。如:CreateFileA、fopen、LoadLibraryA等。
-
…W 版本(Wide):接收“宽字符”字符串(UTF-16)。这是Windows内部原生的、无歧义的编码,能够正确表示包括中文在内的所有Unicode字符。
如果一个软件正确调用了…W版本(例如 CreateFileW、LoadLibraryW),那么中文路径完全不会成为问题。
很多软件还在调用老的 A 版本接口。问题就出在这儿:
程序自己内部往往用的是 UTF-8(现在很常见),却把这段 UTF-8 路径直接扔给了 A 版本接口。系统却按 GBK 去理解这些字节。英文字符碰巧一样,所以没事;中文一碰到,字节对不上,就变成乱码路径。系统拿着乱码去找文件夹,当然找不到,于是报“系统找不到指定的路径”。
为什么这问题一直解决不掉?
- 一是历史包袱重,很多老代码、第三方库当初就图省事用了 A 接口,改起来麻烦。
- 二是跨平台开发时容易忽略:在 Linux/macOS 上路径当 UTF-8 处理很正常,搬到 Windows 却没专门适配代码页这套机制。
结果就是大家被迫形成了一个“潜规则”:安装路径千万别带中文。这也是很多软件在安装的时候会给你指定一个目录的原因。这不是 Windows 本身限制,而是软件没做好国际化的被动规避。
简而言之:“我拿到的是 UTF-8 路径,但我只会用 GBK 的方式去读,结果读不懂。”本质还是软件没正确用上 Windows 原生的 Unicode 接口。