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