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


18

有人给我发送了一个ZIP文件,其中包含带有希伯来语名称的文件(并在Windows上创建,不确定使用哪种工具)。我在Debian Stretch上使用LXDE。Gnome存档管理器设法将文件解压缩,但是希伯来语字符显示为乱码。我我正在将UTF-8八位字节扩展为Unicode字符,例如,我有一个文件,该文件的名称包含四个字符和一个.doc足够的字符,这些字符是:0x008E 0x0087 0x008E 0x0085。使用命令行解压缩实用程序甚至更糟-它拒绝完全解压缩,并抱怨“无效或不完整的多字节或宽字符”。

因此,我的问题是:

  • 是否有另一个解压缩实用程序将使用正确的名称解压缩我的文件?
  • 压缩文件的方式是否存在问题,或者仅仅是ZIP实现的不兼容?甚至是Linux ZIP实用程序的功能/错误?
  • 使用乱码解压缩后,如何获取正确的文件名?

如果您在cp862表中查找这些字节,文件名是否符合您的期望?否则,您知道源计算机的本机编码吗?
Michael Homer 2015年

cp1255的同上,以及其他任何可能的编码;也许可以根据看起来正确的方法进行解决。
Michael Homer

@MichaelHomer:不,看起来不匹配。将区域设置设置为希伯来语-以色列语时,MS Windows会使用源计算机的本机编码,因此我想它有时为UTF-8,有时为CP1255。
einpoklum 2015年

Answers:


15

这听起来像文件名在Windows的专有代码页(之一编码CP8621255等)。

  • 是否有另一个解压缩实用程序将使用正确的名称解压缩我的文件?我不知道本地支持这些代码页的zip实用程序。7z对编码有一定的了解,但我认为它必须是您的系统更普遍了解的编码(您可以通过设置LANG环境变量来选择),而Windows代码页可能不在其中。

    unzip -UU应该从命令行工作以创建名称中具有正确字节的文件(通过禁用所有Unicode支持)。那可能就是您已经从GNOME工具中获得的效果。编码都不正确,但是我们可以在下面修复它。

  • 压缩文件的方式是否存在问题,或者仅仅是ZIP实现的不兼容?甚至是Linux ZIP实用程序的功能/错误?您获得的文件不是可移植的。对于内部使用固定编码并事先知道的编码,这不一定是错误的,尽管格式规范指出名称应该是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端可能很难修复。


我想这将是必须要做的,因为我正在寻找的ZIP文件现在已经消失了,原因是,这里没有相关的原因。谢谢,下次会做的,希望一切顺利。
einpoklum 2015年

1
rarp7zip拒绝处理.zip存档。在Linux上,是否可以使用专有编码的文件名提取存档?当我使用提取时unzip,出现错误:“错误:无法创建╨и╨╕╨┐/Ship_╨п╨Я╤А╨╛╤З╨╗╨░╨Я╤А╨╛╨н╤В╨╛╨ png!.png文件名太长”
Nickolai Leschov

我设法正确地提取了.zip文件LANG=ru_RU.CP1251; unzip Bleed.zip(在我的情况下是西里尔字母编码)。现在,我想知道如何设置系统,以便默认情况下可以在GUI中正确打开此类.zip文件?
Nickolai Leschov '17

@NickolaiLeschov 提出问题,也许有人可以为您提供帮助。您可能需要提供有关系统的更多信息。
Michael Homer

unzip -UU foo.zip为土耳其语字符工作
Mert S. Kaplan

8

我成功地执行了命令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位字符的所有文件,而其中某些字符被跳过,有些出现乱码。


p7zip是唯一对我
有用的文件

6

我刚刚遇到了同样的问题,事实证明,如果您指定了开关unzip,则可以从Ubuntu存储库(UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.)获得该版本的文件,它可以处理文件名的自动解码-a

unzip -a stupid.zip

+1,尽管我现在没有什么可以测试。
einpoklum

1
根据开关的手册页,unzip-a负责转换文本文件。不是文件名。
比利时

@beruic,我已将Unicode码解压缩为文件名(#U + 0040#U + 0050 ...),然后“解压缩-a”确实很有帮助。
chang zhao

1
我尝试了一些漫画。文件名已正确解码,但图像也被解释为文本(!)并完全损坏。它甚至可以将存档中的zip和rar文件解释为文本,检测是完全无用的。
rjh

2

使用西里尔字符解码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*环境变量都没有用。


下一次我将尝试提取这样的zip文件...谢谢。但是-您是否可以将脚本更改为:1.检查是否有两个参数2.如果仅提供zip文件,则将其提取到当前工作目录中?
einpoklum

2

我对这种组合感到幸运:

export LANG=es_MX 
7z x file.zip
convmv -f cp437 -t utf8 -r .

将--notest添加到convmv进行实际重命名。后来我发现了更好的版本:

LANG=es_MX.cp437 unzip -UU file.zip
convmv -f cp437 -t utf8 -r . --notest

+1仅用于convmv和命令行7zip工具。
einpoklum

也许一个人必须尝试不同的选项LANG变量,根据手头的文件编码。我有一个文件LANG=ru_RU.CP1251一起-f cp866工作。
Dmitri Chubarov '19

0

我在Linux中(从命令行)压缩了zip归档文件,并且在Windows上没有正确解压缩带有变音符号的文件名,但是我成功地使用了Bandizip软件将其解压缩,软件可以在工具栏上设置字符集。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.