# 问题
众所周知,GBK 编码是落后时代的产物,UTF-8 编码是未来世界的方向,UTF-8 终将取代 GBK,就像 IPV6 终将取代 IPV4 一样。
近日更换了新的 SSD,重装了系统,索性决定把自己的系统编码直接切换为 UTF-8。可是这一切换带来了问题:路径中含有中文字符的.jar 文件,不能通过双击打开了,但是不含中文字符的.jar 文件仍正常。
经过分析,发现在 Windows10 中即使切换了系统编码为 UTF-8,但是底层系统调用 fork 进程的过程却仍然使用的是 GBK 方式传递命令行参数。我可以理解,因为毕竟现在存在文件系统里的文件夹名都是 GBK,总不能切换一下系统编码还得要递归所有文件全部转换文件名编码吧。
虽然内核已经很大程度上解决了这个问题:比如我在 python 里 sys.argv
拿到的命令行参数就是正确解码的 str 格式,不存在编码问题。大多数的软件也都可以正常运行,比如 Office、Adobe 全家桶之类打开中文文件一点问题都没发生过。然而不知道为什么,Java 在这方面却存在严重的问题。(据说还有一些程序比如 mc、mathematica 也存在这个问题)
解决不了问题的程序,就只能从调用的命令行下手,于是我想到了这样的方式:把带有中文的路径中的路径部分提取出来作为 CWD(当前工作目录),从而使创建进程时提供的命令行参数中只有文件名部分。这样只要文件名是全英文的,即使路径中有中文也没关系。指定的文件可以通过相对于 CWD 的相对路径打开,也就不用把中文的所在目录传进命令行了。
# 解决
写了一个脚本并发布在 Github 上,里面有详细的 README。
https://github.com/Starrah/chinese_path_open