![在 Windows 中创建并在 Linux 中解压的 zip 档案中的文件名的正确编码](https://linux22.com/image/1560660/%E5%9C%A8%20Windows%20%E4%B8%AD%E5%88%9B%E5%BB%BA%E5%B9%B6%E5%9C%A8%20Linux%20%E4%B8%AD%E8%A7%A3%E5%8E%8B%E7%9A%84%20zip%20%E6%A1%A3%E6%A1%88%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E7%9A%84%E6%AD%A3%E7%A1%AE%E7%BC%96%E7%A0%81.png)
我在 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