转换文件名编码

转换文件名编码

我的操作系统是 Arch Linux。我正在尝试提取文件名中包含 CJK 字符的 .zip 存档。它很可能是在 Windows 计算机上创建的。

我尝试了 unzip 实用程序,它产生了无效符号。7za 也是如此,但略有不同。我的 LANG 变量设置为 en_US.UTF-8,但将其设置为 ja_JP.ujis 似乎没有效果。我假设这意味着 CJK 文件名以 UTF-8 以外的格式编码到档案中,我需要将其转换为 UTF-8 才能正确显示。

我知道 convmv,我用一个 shell 脚本测试了所有可能的编码,但都convmv --list无济于事。我大部分文件名都有 Unicode 等效项,但格式繁琐,无法手动重命名所有文件名,但通过它们我可以验证转换是否成功。

通过观察 ls 的十六进制转储和位置推断,我得出结论,U+4EBA(人)在 unzip 输出中表示为 0xC9 0x6C,在 7za 输出中表示为 0xC2 0x90 0x6C。这也意味着我一开始就不处理原始编码并非不可能。

那么,为什么两个 zip 提取器会产生不同的结果,还有其他方法可以帮助我正确地将这些文件名转换为 UTF-8?

答案1

处理 UTF8 路径名时,我的第一个猜测是尝试使用 Python zipfile 库 - 我猜测它的跨平台性足以满足您的需求(另一方面,模块文档没有提到 UTF8...)。

这是一个尝试此操作的小脚本:

#!/usr/bin/python
import zipfile
import sys
import os

if len(sys.argv) < 2:
    print "I require a file name and a directory to unzip to"
    sys.exit()
zip = zipfile.ZipFile(sys.argv[1])
if not os.path.exists(sys.argv[2]):
    os.mkdir(sys.argv[2])

zip.extractall(sys.argv[2])

您可以chmod +x尝试并运行 - 看看它是否适合您的情况。

尽管可能性极小,但这可以解决您的问题。

相关内容