如何正确解压缩具有希伯来语名称的文件的 ZIP 存档?

如何正确解压缩具有希伯来语名称的文件的 ZIP 存档?

有人给我发了一个 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。

    或者,您可以使用iconvfind将所有内容移动到正确的名称。就像是:

    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

我刚刚遇到了同样的问题,事实证明,如果您指定开关,我的unzipUbuntu 存储库 ( ) 中提供的版本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 -UUunzip -aLANG*环境变量都没有任何好处。

相关内容