あれぇ、文字化けするんだけど - PHPをCGIとして動かすとかバージョンが古いとかで、fgetcsv()とか。

Webチームから、以前自社が手がけたサイトの修正依頼がきた。
勿論、僕が一切関わってない仕事だ。


で、納品当時のデータを開いてみて、ビックリ!
ぜーんぶ拡張子が「.cgi」ときたもんだ。
しかもソースは全部SJISで書かれてる。


XAMPPのローカルでどう動かそう?
拡張子をphpに変えて、先頭一行目のアレを消して、動作テストしてみたけど、全部のファイルでやるワケにはいかんし、ましてアップロード先じゃそれで動いてるから、変に変えるワケにもいかん。


インフラ担当の人が、新しく設置したサーバにApacheとか入れていいと言ってたけど、SJISまみれのソースを入れるに忍びない。


使ってないVMwareをあれこれ起動させて、手っ取り早く使えそうな環境を準備する…

#!/usr/local/bin/php

とかって書いてあるので、パスを調べるがそんなもんねーよ、とlsコマンドが返してくるので、whichで探して、lnコマンドだ。


って、php-cgiってなんだ?


きっとPHPCGIとして動作させるためのものだと勝手に理解して、ln -s を実行。


…のはいいけど、言語設定を変えないと。
httpd.confのAddDefaultCharsetはOffにした。
php.iniもあれこれ変更。
mbstring関連で、http_inputとhttp_outputはいずれもpassに変更。internal_encodingも念の為にSJISにして、detect順もSJISを先頭に。あとはAddHandlerとかいろいろ変えて.cgiPHPが動作するようにしたら…


CSVから読み込んだデータの先頭が文字化け。
どうやらPHP4からPHP5の間で色々とあるらしい。
解決方法も色々あったが、どうもイマイチだ。

ホームサーバ&ホームネットワークメモ php.ini fgetcsv 文字化けで、fgetcsv()を使わずに、fgets()とexplode()で回避してる方法が載ってた。
確かに、ちょっと変えるだけだし…

while ($line=fgetcsv($fp,512)){

これを

while($fdata = fgets($fp, 512)){
    $line = explode(",", $fdata);

と、変更する。


…一応、テスト用サーバでは正常に動作した。


しかし、テスト用に拡張子を変更したファイルだとfgetcsv()でも文字化けしないんだよなぁ。
CGIとして動作させることに問題があるのかなぁ?


問題はお客様の環境で文字化けしないってこと。
ここであれこれ手を入れた場合、向こう側で動作しなくなるとか、おかしな動作をするようになる…なんてことも考えられるかななぁ。


そこは今回の修正箇所とは違うし、開き直って放置しとくか。