unzipで展開されるファイル名が化けないようにする

Windowsで作られたzipファイルをLinuxで展開すると日本語のファイル名が化ける。これはアーカイブ内のファイル名がSJISで記録されているためで、展開後にファイル名をSJISEUCに変換してやるとたいてい上手くいくのだが、たまに上手くいかないときがある。どうも内部の処理で不正なバイト列を変換しているような感じだったので、ソースを調べてみたらfileio.c内で以下のような箇所が見つかった。

         /* translate the Zip entry filename coded in host-dependent "extended
            ASCII" into the compiler's (system's) internal text code page */
         Ext_ASCII_TO_Native(G.filename, G.pInfo->hostnum, G.pInfo->hostver,
                             G.pInfo->HasUxAtt, (option == DS_FN_L));

この部分(2カ所ある)をコメントアウトすると、ファイル名が変換されることはなくなった。

ちなみに、ファイル名をSJISEUCに変換するのは以下のようなスクリプトでやっている。

#! /bin/sh

for f in $*; do
        n=`echo $f | nkf -e`
        [ "$f" != "$n" ] && mv "$f" "$n"
done