在 Windows 中创建并在 Linux 中解压的 zip 档案中的文件名的正确编码

在 Windows 中创建并在 Linux 中解压的 zip 档案中的文件名的正确编码

我在 Windows 和 Linux(Centos)上使用不同的字符集时遇到了问题。

我有许多不同语言的文件,文件名中都有特殊字符。zip 存档是在 Win7 下生成的,并上传到 Linux 服务器上。在 Windows 下,所有字符都显示正常,符合预期。但在使用 phpsZipArchive()或 Linux上传和提取后unzip,一些特殊字符显示为奇怪的错误字符。

我知道这是 Windows 和 Linux 交互中的一个已知问题,但我无法解决我的问题。我尝试使用不同的字符集解压我的 zip 文件,但对我而言都不起作用。在葡萄牙语中,õ 字符会产生很多问题,但 ç 字符则没问题。

aplicações.txt解压后aplicaçΣes.txt

据我理解,Windows 使用 ASCII 代码字符集 IBM860,但有时我在 Win7 下使用 WinRar 制作 zip 存档时会读到 windows-1257,我不知道使用的是哪种字符集。有没有办法检查这一点,或者告诉 WinRar 使用 UTF-8?

当将 zip 存档上传到 Linux 操作系统并通过ZipArchive()(php) 或在 Linux 上bash使用解压时unzip,文件名是错误的。我认为这是因为 Linux 使用了 UTF-8。

在Linux命令下我尝试过:

unzip -O windows-1257 uploaded.zip -d zipout/ 

在Linux命令下我尝试过:

unzip -O IBM860 uploaded.zip -d zipout/ 

在Linux命令下我尝试过:

unzip -O IBM437 uploaded.zip -d zipout/ 

在Linux命令下我尝试过:

unzip -O UTF-8 uploaded.zip -d zipout/ 

在Linux命令下我尝试过:

unzip -O UTF-16 uploaded.zip -d zipout/

答案1

如果您用于压缩文件的 Windows 7 版本的语言是巴西葡萄牙语,那么编码可能是 IBM-850 或 Windows-1252。试试这些。

我也遇到过这个问题。但在 Windows 的不同语言之间转换时也会发生这种情况。例如,在英语和巴西葡萄牙语 Windows 版本之间,英语版本使用 IBM-437,而 pt-BR 版本使用 IBM-850。

如果您使用 WinZip 进行压缩,则不会发生此问题。我不建议使用内置的 Windows 进行压缩和/或解压,因为这也会导致文件名的编码问题。

答案2

根据https://sourceforge.net/p/sevenzip/bugs/620/#441a

最新的 ZIP 格式规范支持 Unicode 文件名。名称必须采用 UTF-8 编码,并且必须设置通用标志字段中的第 11 位(偏移量 6 处的 2 个字节)。

因此,如果您将工具升级到支持较新的 ZIP 格式的版本,一切就会自动运行。

答案3

我能够使用以下方法修复它:

saveLang=$LANG

export LANG=en_US
7z x file.zip

export LANG=$saveLang

答案4

在 Ubuntu 上,您可以使用修补的 p7zip 而不是 unzip 来获得正确的 oem 字符集支持。

sudo apt-add-repository ppa:alkisg/ppa
sudo apt-get update
sudo apt-get install p7zip p7zip-full

对于其他发行版,您可以自行构建修补的 p7zip。unzip 的补丁也可用。讨论:https://github.com/mate-desktop/engrampa/issues/5

相关内容