unzipと文字コード
最近、暇つぶしとノウハウゲットを兼ね、PHPプログラミングで遊んでいます。
とはいってもそんな難しいものを作っている訳ではなく、ファイルのアップローダを少し拡張したようなものです。
ちなみに、サーバは先日書いた玄箱で、apacheとともに動かしています。php4.2.3のインストは少し厄介だった気もしますが、大体apt-getでなんとかなったように思います。
さて、ファイルをまとめてアップする機能をつけるのに、圧縮したファイルをアップして解凍しようとしていました。
当初zipを使う事を考えていましたが・・・問題発生。Windowsで作った圧縮ファイルをアップし、unzipで解凍するようなスクリプトを組むと、ファイル名の日本語部分がおかしくなります。
Linux上はEUCだから、解凍後S-JISからEUCにかえりゃいいんだろ!と思われるかもしれません。そんな ふうに考えていた時期が私にもありました・・・。
色々調べてみましたが、どうも事は単純ではないらしく。そもそも、アップ・解凍したファイル名をnkfしてみたところで、読める文字にならりません。-e -s -jどのオプションもダメ。
なんか、圧縮したS-JISのファイル名を、解凍時に壊してくれるようです。他のコードは知らない。
http://www.coara.or.jp/~sudakyo/dasworksrpms.htmlに日本語ファイルに対応したunzipを作ってくださったものがありますが、玄箱ppcでrebuildしようと素人ながらやってみたものの失敗。
そんなわけで、圧縮形式を変えるという至極楽な手段に訴えました。
apt-getでlhaをインストして・・・解凍。快調。
zipばかりが世の中ではないと思い知らされた今日この頃です。
実はlhaコマンドの、解凍先ディレクトリ指定にも少し悩みました。調べてみると
lha [-]{axelvudmcp[q{num}][vnfodizg012]}[w=
] lzhfile [file...]
とお決まりのように書いてありますが、PHP内でsystem関数使って
lha x w=(DIR) (解凍したいlzh)
としてもうまく解凍できない。xをeにしてもだめ。
lha ew=(DIR) (解凍したいlzh)
のように、くっつけないとダメなようでした。