有人给我发了一个 ZIP 文件,其中包含希伯来语名称的文件(在 Windows 上创建,不确定使用哪种工具)。我在 Debian Stretch 上使用 LXDE。 Gnome 存档管理器设法解压缩该文件,但希伯来字符是乱码。我思考我将 UTF-8 八位字节扩展为 Unicode 字符,例如,我有一个文件,其名称有四个字符和一个 .doc 后缀,字符为: 0x008E 0x0087 0x008E 0x0085 。使用命令行解压缩实用程序更糟糕 - 它拒绝完全解压缩,抱怨“无效或不完整的多字节或宽字符”。
所以,我的问题是:
- 是否有另一个解压缩实用程序可以使用正确的名称解压缩我的文件?
- 文件的压缩方式是否有问题,或者只是 ZIP 实现的不兼容?或者甚至是 Linux ZIP 实用程序的错误功能/错误?
- 使用乱码解压后如何获得正确的文件名?
答案1
听起来文件名是用 Windows 专有代码页之一编码的(CP862,1255, ETC)。
是否有另一个解压缩实用程序可以使用正确的名称解压缩我的文件?我不知道有哪个 zip 实用程序本身支持这些代码页。 7z 对编码有一定的了解,但我相信它必须是您的系统更普遍了解的编码(您通过设置
LANG
环境变量来选择它),而 Windows 代码页可能不属于其中。unzip -UU
应该从命令行创建名称中包含正确字节的文件(通过禁用所有 Unicode 支持)。这可能就是您从 GNOME 工具中获得的效果。无论哪种方式编码都不会正确,但我们可以在下面修复它。文件的压缩方式是否有问题,或者只是 ZIP 实现的不兼容?或者甚至是 Linux ZIP 实用程序的错误功能/错误?您收到的文件不是可移植创建的。这不一定错误的对于编码是固定且预先已知的内部使用,尽管格式规范规定名称应该是 UTF-8 或 cp437,而您的名称既不是 UTF-8 也不是 cp437。即使在 Windows 计算机之间,使用不同的代码页也效果不佳,但非 Windows 计算机一开始就没有这些代码页的概念。大多数工具都对其文件名进行 UTF-8 编码(这仍然不足以避免问题)。
使用乱码解压后如何获得正确的文件名?如果您可以识别文件名的编码,则可以将现有名称中的字节转换为 UTF-8 并将现有文件移动到正确的名称。工具
convmv
本质上将该过程包装成一个命令:convmv -f cp862 -t utf8 -r .
将尝试将内部的所有内容.
从 cp862 转换为 UTF-8。或者,您可以使用
iconv
和find
将所有内容移动到正确的名称。就像是:find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | iconv -f cp862 -t utf8)"' sh {} \;
会查找当前目录下的所有文件并尝试将文件名转换为UTF-8。
无论哪种情况,您都可以尝试不同的编码并尝试找到一种有意义的编码。
修复编码后,如果您想将这些文件以另一个方向发回,则另一端可能会遇到相同的问题。在这种情况下,您可以在使用 压缩文件之前反转该过程-UU
,因为在 Windows 端可能很难修复。
答案2
我的命令成功了7z x <source.zip>
。
版本:
p7zip Version 16.02 (locale=utf8,Utf16=on,HugeFiles=on,64 bits,[...])
潜在相关环境:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
LC_CTYPE=UTF-8
它能够解压缩文件名中包含 8 位字符的所有文件,其中一些字符被跳过,一些字符出现乱码。
答案3
我刚刚遇到了同样的问题,事实证明,如果您指定开关,我的unzip
Ubuntu 存储库 ( ) 中提供的版本UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.
可以处理文件名的自动解码-a
。
unzip -a stupid.zip
答案4
我在解码带有西里尔字符的 zip 存档时遇到了类似的问题。一行 python 脚本正确完成了这项工作:
#!/usr/bin/python
import zipfile
import sys
zipfile.ZipFile(sys.argv[1], 'r').extractall(sys.argv[2] if len(sys.argv) > 2 else '.')
然后就调用unzip_enc
就调用了unzip_enc ZIP_FILE [TARGET_DIR]
对我来说unzip -UU
, unzip -a
和LANG*
环境变量都没有任何好处。