誰かが私にヘブライ語の名前のファイルを含むZipファイルを送ってくれました(Windowsで作成したものですが、どのツールを使っているかわかりません) Debian StretchでLXDEを使用しています。 Gnomeアーカイブマネージャーはファイルを解凍できますが、ヘブライ語の文字が文字化けします。 I think Unicode文字に拡張されたUTF-8オクテットを取得しています。名前が4文字で拡張子が.docのファイルがあり、その文字は0x008E 0x0087 0x008E 0x0085です。コマンドラインunzipユーティリティの使用はさらに悪いことです-「無効または不完全なマルチバイトまたはワイド文字」について不平を言って、完全に解凍することを拒否します。
だから、私の質問は:
ファイル名はWindows独自のコードページ( CP862 、 1255 など)でエンコードされているようです。
正しい名前でファイルを解凍する別の解凍ユーティリティはありますか?これらのコードページをネイティブでサポートする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に変換しようとします。
または、iconv
およびfind
を使用して、すべてを正しい名前に移動できます。何かのようなもの:
find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | iconv -f cp862 -t utf8)"' sh {} \;
現在のディレクトリの下にあるすべてのファイルを検索し、名前をUTF-8に変換しようとします。
どちらの場合も、さまざまなエンコーディングを試して、意味のあるエンコーディングを見つけることができます。
エンコードを修正した後、これらのファイルを別の方向に送り返したい場合は、反対側でも同じ問題が発生する可能性があります。その場合、Windows側で修正するのは非常に難しいため、-UU
でファイルを圧縮する前にプロセスを逆にすることができます。
コマンド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ビット文字が含まれるすべてのファイルを解凍できました。これらの文字の一部はスキップされ、一部は文字化けしました。
同じ問題が発生しました。Ubuntuリポジトリ(UnZip 6.00 of 20 April 2009, by Debian. Original by Info-Zip.
)から入手できる私のバージョンのunzip
は、-a
スイッチを指定すると、ファイル名の自動デコードを処理できることがわかりました。
unzip -a stupid.Zip
私はこの組み合わせで運が良かった:
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
キリル文字を含むZipアーカイブをデコードする際にも同様の問題がありました。 1行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*
環境変数はうまくいきました。
LinuxでZipアーカイブを圧縮し(コマンドラインから)、発音区別符号付きのファイル名をWindowsで正しく解凍できませんが、ツールバーに文字セットを設定できる Bandizip ソフトウェアで正常に解凍しました。