指定されたエンコーディングでZIPを解凍する


25

ファイルを含むZIPファイルを取得しました。ファイル名はエンコードされています。私はそれらのファイル名のエンコーディングを知っているとしましょうが、私はまだそれらを適切に解凍する方法を知りません。

ファイルの例は、「【SSK字幕組】The Vampire Diaries吸血鬼日记S06E12.ass」というファイルを1つ含んでいます。

使用されているエンコードはGB18030(中国語)であることを知っています

質問です-適切なエンコードされたファイル名を取得するために、unzipまたは他のCLIユーティリティを使用してFreeBSDでそのファイルを解凍する方法は?できる限りのことを試しましたが、結果は決して良くありませんでした。助けてください。

OSXで試しました:

MBP1:test 2ge$ bsdtar xf gb18030.zip
MBP1:test 2ge$ ls
%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12/      gb18030.zip
MBP1:test 2ge$ cd %A1%BESSK%D7%D6Ļ%D7顿The\ Vampire\ Diaries\ %CE%FCѪ%B9%ED%C8ռ%C7S06E12/
MBP1:%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12 2ge$ ls
%A1%BESSK%D7%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12.ass*
MBP1:%A1%BESSK%D7%D6Ļ%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%D6Ļ%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%D6Ļ%D7顿The Vampire Diaries %CE%FCѪ%B9%ED%C8ռ%C7S06E12.ass
Ready!

unzipで同様に試しましたが、同様の問題が発生します。

ありがとう、今は無料の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

最初に、中国の名前を適切に表示したいと思います。私が変更され

setenv LC_ALL zh_CN.GB18030
setenv LANG zh_CN.GB18030

次に、ファイルをダウンロードし、「ls」を試して適切な文字を表示しようとしましたが、運はありません。だから、最初の中国語のロケールを解決して、適切な結果がいつ得られるかを確認する必要があると思います。実際に比較できます。これで私を喜ばせることもできますか?

回答:


22

エンコードが何であるかを知っている限り、Ubuntu 16.04で任意のエンコードでzipを解凍するために行うことは次のとおりです。同じ方法は、広く利用可能なunzipツールに依存しているだけなので、FreeBSDでも動作するはずです。

  1. スペルを間違えないように、エンコーディングの正確な名前を再確認します。 ます https //www.iana.org/assignments/character-sets/character-sets.xhtml

  2. 私は単に走る

    $ unzip -O <encoding> <filename> -d <target_dir>
    

    または

    $ unzip -I <encoding> <filename> -d <target_dir>
    

    間の選択-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
      ...
    

    -O多くの人が.zipUnixでファイルを作成するわけではないので、私は単に試してみて、うまくいくはずです...


したがって、あなたの特定の例では:

  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
    

    ... できます。


ギリシャ語のWindowsで作成されたジッパーのために私はこの方法で成功を収めたとCP737をコードする
ndemou

ブラボー!私はマニュアルページをダブルチェックしましたが、実際には動作しますが、完全に文書化されていません。zsh補完にはこのパラメータがありません。
-ttimasdf

2
unzipMac OS Xにはこのオプションがなく、常にパーセントでエンコードされたファイル名を作成します。@javacomのunar提案は魅力的でした。
フィルクリロフ

Debian固有の機能のように見えます。私unzipはそれUnZip 6.00 of 20 April 2009, by Info-ZIP. Maintained by C. Spielerがそうであり、そのようなオプションを提供しないと言います。
L29Ah

1
unzipDebian 9の@ L29Ah My はまったく同じバージョンであり、そのようなオプションはありません。おそらくUbuntu固有ですか?
-Arnie97

11

ほとんどのPOSIXファイルシステムでは、ファイル名は単なる一連のバイトであり、それを理解するのはユーザー空間次第です。これをあなたの利点に使用できます。

  1. まず、使用してアーカイブを解凍bsdtarするので、unzipツールはファイル名をマングルようだbsdtarが生それらを抽出する一方、。(Linuxでこれをテストしています。FreeBSDは単にそれを呼び出すと思いますtar。)

    $ bsdtar xf gb18030.zip
    
  2. などのツールiconvが名前を正常にデコードできることを確認します。

    $ find . | iconv -f gb18030 -t utf-8
    

    (これはfind出力にのみ影響し、ファイル自体には影響しないことに注意してください。)

  3. 最後にconvmv、ファイル名をUTF-8に変換するために使用します。

    $ convmv -r -f gb18030 -t utf-8 --notest .
    

    (注:私はGB18030のサポートのためにCPANからエンコード:: HanExtraをインストールする必要がありました、そして手動で追加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
    

    (少なくともLinuxでは、これiconvはほとんど常に利用可能で、常に gb18030 サポートするという利点があります。)


これを調べてくれてありがとう。私は現在OSXでテストしています(しかし、これは本当にFreeBSDに近いもので、結果は似ていると思います)。私の質問にコメントを追加し、...ここで編集することはできません
2GE

1
@ 2ge:ああ、OSXは実際にはまったく異なる可能性があります。HFS+はバイトストリングを保存するのではなく、ファイル名をNFD UTF-16に内部的に強制するため、GB18030の名前を変換する前に破損する可能性があります。
user1686

元の質問を編集し、コメントを追加しました。
2ge

ええ、私はmacOS Sierraで試してみましたが、bsdtarはたくさんの「失敗したxxxを作成できません」というエラーを報告しました(親ディレクトリ名が間違っているため)。アーカイブをLinux VPSにコピーし、unzip -Oを使用して展開し、ssh -Cを使用して結果をMacにコピーし直さなければなりませんでした。
チャン銭

10

方法1:unarユーティリティを使用する

sudo apt-get install unar

unar -e gb18030 gb18030.zip

方法2:Pythonスクリプトを使用してファイルを解凍します(https://gist.github.com/usunyu/dfc6e56af6e6caab8018bef4c3f3d452#file-gbk-unzip-pyを参照)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# unzip-gbk.py

import os
import sys
import zipfile
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--encoding", help="encoding for filename, default gbk")
parser.add_argument("-l", help="list filenames in zipfile, do not unzip", action="store_true")
parser.add_argument("file", help="process file.zip")
args = parser.parse_args()
print "Processing File " + args.file

file=zipfile.ZipFile(args.file,"r");
if args.encoding:
    print "Encoding " + args.encoding
for name in file.namelist():
    if args.encoding:
        utf8name=name.decode(args.encoding)
    else:
        utf8name=name.decode('gbk')
    pathname = os.path.dirname(utf8name)
    if args.l:
        print "Filename " + utf8name
    else:
        print "Extracting " + utf8name
        if not os.path.exists(pathname) and pathname!= "":
            os.makedirs(pathname)
        data = file.read(name)
        if not os.path.exists(utf8name):
            fo = open(utf8name, "w")
            fo.write(data)
            fo.close
file.close()

例gb18030.zipは、次のファイルを抽出します

【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12
【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12/【SSK字幕组】The Vampire Diaries 吸血鬼日记S06E12.ass

2
ありがとう、unarこの方法は、Mac OS X上で少なくとも最も手間のかからないです
フィル・クリロフ

4

OS Xでは、The Unarchiverと呼ばれるGUIアプリケーションを使用できます。Mac App StoreまたはHomebrew Caskを使用してインストールできます。

brew cask install the-unarchiver

それを使用してZIPファイルを開くと、アプリケーションでは、アーカイブからファイル名のプレビューを使用して適切なエンコードを選択できます。


4

7zはスイッチで文字セットIDをサポートします -scsで。例:

7z x -scs903 some.zip

ここで、903は中文簡體文字セットです。文字セットIDのより長いリストは、ここにあります


2
7z -scsスイッチは、@-definedファイルリストのエンコーディングのみを選択します。
フィルクリロフ

1

7zを使用してファイルを抽出します

7z x yourfile.zip

その後、これらのファイル名のエンコーディングを自分で変換します。

convmv --notest -f from_encoding -t utf-8 -r your_extracted_folder/

これは私のために機能します。私の場合のfrom_encodingはtis-620(タイ語のエンコーディング)であり、言語の適切なエンコーディングを見つける必要があります。一般的なものは通常この問題を解決しますが、ファイル名がまだ読めない場合は、from_encodingをwindows-1252やshift-jis(日本語)などに変更してみてください。使用可能なエンコードをコマンドを使用して一覧表示できます。

convmv --list
iconv --list

これは私にとって非常に簡単な「解決方法」です。


-1

7zipを使用したところ、適切なエンコーディングを選択できました。

(標準のzipではできなかったこと)

しかし、GUIツールを使用してWindowsで使用しました。たぶん、コマンドライン7zもあなたのために働くでしょう。


7z推奨する答えがあり、あなたの答えはそれ以上何も追加しません。
メレビウス

1
はい、そこにある今、 7zの推薦別の答え。ほぼ5か月後に投稿された回答に、「追加」するベリーの回答はほとんど期待できません。
スコット

@Scott申し訳ありませんが、英語の月の略語を正しく読むことができませんでした。
メレビウス

OK。マウスポインターをページ上の任意の日付(および「ホバー」)の上に置くと、日付が数字で表示されることを知りたいかもしれません。(少なくともこれはコンピューターでは機能しますが、電話ではうまく機能しないと言われています。)また、質問の右下に「アクティブな最古の票」が表示されます。これは回答のソート順です。「最も古い」をクリックすると、最も古いものから新しいものの順に回答が得られます。
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.