Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: zipフィルタ Re: lha フィルタ



寺西です。

Tadamasa Teranishi wrote:
> 
> 手元の .zip ファイルは WinZip 8.1SR-1 日本語版ですが、これはこれで
> 王道のツールですけどね。
> # 日本語ファイル名の内部エンコードが特殊なのかな!?

ということではなくて、やはり unzip の問題でした。

unzip の fileio.c の do_string で、Ext_ASCII_TO_Native() により、
ファイルネームのコード変換を行っていました。
これは、fat または hpfs の場合(実際には更に条件が付く)は iso8859-1 と
みなし、OEM 文字の変換を行うようです。
Shift_JIS コードは、ここで iso8859-1 と見なされ、破壊されます。
(可逆変換ではないので、変換後のコードから元のコードには戻せません。)

残念なことにこの機能を禁止するスイッチ類はないみたいです。

該当部分をコメントアウトすれば、unzip -z で Shift_JIS 文字で表示
されることは確認しました。

WinZip で作成した .zip ファイルの場合、

Archive:  test002.zip   8497 bytes   2 files
-rw-rw-rw-  2.0 fat    25600 b- defN 15-May-03 04:56 aaa.doc
-rw-rw-rw-  2.0 fat    27648 b- defN  1-Apr-03 23:42 bbb.doc
2 files, 53248 bytes uncompressed, 8287 bytes compressed:  84.4%

のように fat になります。UNIX だと unx になります。
cygwin は確かめていませんが、cygwin で作成した場合には unx になる
のではないかと思います。
このため、WinZip では Ext_ASCII_TO_Native() が働き、文字化けしたが
cygwin だと Ext_ASCII_TO_Native() が働かず、文字化けしなかった
ということではないかと思います。

改造した unzip が必須というのはあまりにきついので、
後ろ向きな解決方法ですが、fat と hpfs の場合は、元ファイル名を
使わないといった対策が現実的ではないかと思います。

あるいは、Perl モジュール必須にするかですね。
-- 
=====================================================================
寺西 忠勝(TADAMASA TERANISHI)  yw3t-trns@xxxxxxxxxxxxxxx
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint =  474E 4D93 8E97 11F6 662D  8A42 17F5 52F4 10E7 D14E