Windows環境で作られたzip書庫のファイル名化けを解消する方法
Linux で人から渡された zip 書庫を解凍すると、ファイル名が文字化けしている事が良くあります。
zip 書庫は、格納するファイルの文字コードをそのまま保存しており、Windows 環境で作った日本語ファイル名には、文字コード CP932 が使用されるため、UTF8 が使用されている最近の Linux 環境では文字化けするのは当然です。
このようなファイルは、convmv コマンドでファイル名の変換を試してみます。
$ unzip sample1.zip Archive: sample1.zip extracting: ?V?????t?H???_/?V?K?e?L?X?g ?h?L???????g.txt $ convmv -r -f cp932 -t utf8 * Your Perl version has fleas #37757 #49830 Starting a dry run without changes... mv "?V?????t?H???_/?V?K?e?L?X?g ?h?L???????g.txt" "?V?????t?H???_/新規テキスト ドキュメント.txt" mv "./?V?????t?H???_" "./新しいフォルダ" No changes to your files done. Use --notest to finally rename the files.
うまく変換されているようなら、--notest オプションを付けて変換を実行します。
全ての場合でこの方法でうまくいくならそれでいいのですが、一部の zip 書庫については、この方法でもうまくいかないことがあります。
$ unzip sample2.zip Archive: sample2.zip extracting: ?V?????t?H???_/?V?K?e?L?X?g ?h?L???????g.txt honda@galeon:/tmp$ convmv -r -f cp932 -t utf8 * Your Perl version has fleas #37757 #49830 Starting a dry run without changes... mv "?V?????t?H???_/?V?K?e?L?X?g ?h?L???????g.txt" "?V?????t?H???_/ノV?K稙祗禮稟 禀祗籵紆糜稟.txt" mv "./?V?????t?H???_" "./ノV鮹鴣穰礬糀秬" No changes to your files done. Use --notest to finally rename the files.
これは、unzip コマンドが解凍を実施する際に、ある条件*1でファイル名の変換を実施しているが原因のようです。
上のリンク先の方は、ファイル名変換を実行する関数を無効にした unzip コマンドを再コンパイルすることで対処されています。他にも debian だと、unzip-cp932 というパッケージ*2を利用する方法もあります。
自分の場合は、jar コマンドで解凍を行って対処しています。jar 形式は zip 書庫がそのまま使用されていることが多く、jar コマンドは zip 書庫の圧縮/解凍をすることも可能です。ちなみにオプションは、tar コマンドとほとんど同じです。
$ jar xvf sample2.zip created: ?V?????t?H???_/ extracted: ?V?????t?H???_/?V?K?e?L?X?g ?h?L???????g.txt
最近のディストリビューションは java パッケージと共に jar コマンドが公式に提供されていることが多いので、unzip コマンドを再コンパイルしたり、パッケージを独自に用意する必要がないのが、この方法のメリットです。
デメリットは、unzip を利用している file-roller 等では、問題が残ったままになることが挙げられますが、最終的に文字化けを解消するには、convmv コマンドの使用が必要なので、はじめから CUI で解凍を行うのが良さそうな気がします。
*1:使用する圧縮ソフトが影響するようです。
*2:http://debian.fam.cx/index.php?sarge%2FJapanese#content_1_70