使用给定的编码解压缩 ZIP

2ge*_*2ge 34 zip encoding

我得到了 ZIP 文件,其中包含文件,哪些文件名采用某种编码。假设我知道这些文件名的编码,但我仍然不知道如何正确解压缩它们。

这是示例文件,它包含一个文件“?SSK????吸血鬼日记????S06E12.ass”

我知道使用的编码是 GB18030(中文)

问题是 - 如何使用 unzip 或其他 CLI 实用程序在 FreeBSD 中解压缩该文件以获得正确编码的文件名?我尽我所能,但结果从来没有好。请帮忙。

我在 OSX 上试过:

MBP1:test 2ge$ bsdtar xf gb18030.zip
MBP1:test 2ge$ ls
%A1%BESSK%D7%D6L?%D7?The Vampire Diaries %CE%FC?%B9%ED%C8?%C7S06E12/      gb18030.zip
MBP1:test 2ge$ cd %A1%BESSK%D7%D6L?%D7?The\ Vampire\ Diaries\ %CE%FC?%B9%ED%C8?%C7S06E12/
MBP1:%A1%BESSK%D7%D6L?%D7?The Vampire Diaries %CE%FC?%B9%ED%C8?%C7S06E12 2ge$ ls
%A1%BESSK%D7%D6L?%D7?The Vampire Diaries %CE%FC?%B9%ED%C8?%C7S06E12.ass*
MBP1:%A1%BESSK%D7%D6L?%D7?The Vampire Diaries %CE%FC?%B9%ED%C8?%C7S06E12 2ge$ find . | iconv -f gb18030 -t utf-8
.
./%A1%BESSK%D7%D6L?%D7??he Vampire Diaries %CE%FC?%B9%ED%C8?%C7S06E12.ass 
MBP1:%A1%BESSK%D7%D6L?%D7?The Vampire Diaries %CE%FC?%B9%ED%C8?%C7S06E12 2ge$ convmv -r -f gb18030 -t utf-8 --notest .
Skipping, already UTF-8: ./%A1%BESSK%D7%D6L?%D7?The Vampire Diaries %CE%FC?%B9%ED%C8?%C7S06E12.ass
Ready!
Run Code Online (Sandbox Code Playgroud)

我尝试了类似的解压缩,但我遇到了类似的问题。

谢谢,现在尝试免费的 BSD,我正在使用来自 OSX(终端)的 SSH 进行连接:

# locale
LANG=
LC_CTYPE="C"
LC_COLLATE="C"
LC_TIME="C"
LC_NUMERIC="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=C
Run Code Online (Sandbox Code Playgroud)

首先,我想正确显示中文名称。我变了

setenv LC_ALL zh_CN.GB18030
setenv LANG zh_CN.GB18030
Run Code Online (Sandbox Code Playgroud)

然后我下载了文件并尝试“ls”以查看正确的字符,但不是运气。所以我想我必须先解决中文语言环境来验证何时得到正确的结果,实际上我可以比较它。你也可以帮我吗?

小智 32

这是我在 Ubuntu 16.04 上所做的以任何编码解压缩 zip 的操作,只要我知道该编码是什么。同样的方法应该适用于 FreeBSD,因为它只依赖于广泛可用的unzip工具。

  1. 我仔细检查了编码的确切名称,以免拼错:https : //www.iana.org/assignments/character-sets/character-sets.xhtml

  2. 我只是跑

    $ unzip -O <encoding> <filename> -d <target_dir>
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    $ unzip -I <encoding> <filename> -d <target_dir>
    
    Run Code Online (Sandbox Code Playgroud)

    在此处选择-O-I根据说明进行选择:

    $ unzip -h
    UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.
      ...
      -O CHARSET  specify a character encoding for DOS, Windows and OS/2 archives
      -I CHARSET  specify a character encoding for UNIX and other archives
      ...
    
    Run Code Online (Sandbox Code Playgroud)

    这意味着我只是尝试一下-O,它应该可以工作,因为没有多少人会.zip在 Unix 中创建文件......


因此,对于您的具体示例:

  1. 确切的编码名称是GB18030.

  2. 我使用-O标志和:

    $ unzip -O GB18030 gb18030.zip -d target_dir
    Archive:  gb18030.zip
       creating: target_dir/?SSK????The Vampire Diaries ?????S06E12/
      inflating: target_dir/?SSK????The Vampire Diaries ?????S06E12/?SSK????The Vampire Diaries ?????S06E12.ass
    
    Run Code Online (Sandbox Code Playgroud)

    ... 有用。

  • `unzip` 在 Mac OS X 中没有这个选项,并且总是创建百分比编码的文件名。@javacom 的 `unar` 建议很有魅力。 (4认同)
  • 对于由希腊 Windows 创建的 zip,我成功使用了这种方法并编码了 CP737 (3认同)
  • @L29Ah 我在 Debian 9 中的 `unzip` 是完全相同的版本,没有这样的选项。可能是特定于 Ubuntu 的? (3认同)

小智 24

方法 1:使用 unar 实用程序

sudo apt-get install unar

unar -e gb18030 gb18030.zip
Run Code Online (Sandbox Code Playgroud)

方法二:使用python脚本解压文件(参考https://gist.github.com/usunyu/dfc6e56af6e6caab8018bef4c3f3d452#file-gbk-unzip-py

sudo apt-get install unar

unar -e gb18030 gb18030.zip
Run Code Online (Sandbox Code Playgroud)

示例 gb18030.zip 将提取以下文件

?SSK????The Vampire Diaries ?????S06E12
?SSK????The Vampire Diaries ?????S06E12/?SSK????The Vampire Diaries ?????S06E12.ass
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,`unar` 方法至少在 Mac OS X 上是最轻松的。 (5认同)
  • 如果您不提供编码,“unar”将会猜测编码。不错的工具。 (4认同)

use*_*686 12

在大多数 POSIX 文件系统上,文件名只是一系列字节,由用户空间来理解它。您可以充分利用这一点。

  1. 首先,使用 提取存档bsdtar,因为该unzip工具似乎会破坏文件名,而 bsdtar 将原始提取它们。(我正在 Linux 上测试这个。我猜 FreeBSD 只是称它为tar。)

    $ bsdtar xf gb18030.zip
    
    Run Code Online (Sandbox Code Playgroud)
  2. 验证诸如此类的工具是否iconv可以成功解码名称:

    $ find . | iconv -f gb18030 -t utf-8
    
    Run Code Online (Sandbox Code Playgroud)

    (请注意,这仅影响find输出,而不影响文件本身。)

  3. 最后用于convmv将文件名转换为 UTF-8:

    $ convmv -r -f gb18030 -t utf-8 --notest .
    
    Run Code Online (Sandbox Code Playgroud)

    (注意:我必须从 CPAN 安装 Encode::HanExtra 以获得 GB18030 支持,手动添加use Encode::HanExtra;到 /usr/bin/convmv 即使它应该

  4. 如果convmv不可用,请编写脚本:

    $ find . -depth | while read -r old; do
        old=./$old;
        head=${old%/*};
        tail=${old##*/};
        new=$head/$(echo "$tail" | iconv -f gb18030 -t utf-8);
        [ "$old" = "$new" ] || mv "$old" "$new";
    done
    
    Run Code Online (Sandbox Code Playgroud)

    (至少在 Linux 上,这有一个优势,iconv几乎总是可用的,并且它总是支持 gb18030。)

  • @2ge:啊,OSX 实际上可能完全不同,因为 HFS+ 在内部强制将文件名转换为 NFD UTF-16,而不是存储字节串,因此它有可能在您有机会转换它们之前损坏 GB18030 名称。 (2认同)

Mel*_*ius 7

在 OS X 上,您可以使用名为The Unarchiver的 GUI 应用程序。它可以使用Mac App StoreHomebrew Cask 安装

brew cask install the-unarchiver
Run Code Online (Sandbox Code Playgroud)

当您使用它打开 ZIP 文件时,该应用程序允许您使用存档中文件名的预览来选择适当的编码。


ohh*_*hho 5

7z 支持带有 switch 的字符集 ID -scs,例如:

7z x -scs903 some.zip
Run Code Online (Sandbox Code Playgroud)

903在哪里????字符集。可以在此处找到更长的字符集 ID 列表。

  • `7z` `-scs` 开关只选择 `@` 定义的文件列表的编码。 (2认同)