あれぇ、文字化けするんだけど - PHPをCGIとして動かすとかバージョンが古いとかで、fgetcsv()とか。
Webチームから、以前自社が手がけたサイトの修正依頼がきた。
勿論、僕が一切関わってない仕事だ。
で、納品当時のデータを開いてみて、ビックリ!
ぜーんぶ拡張子が「.cgi」ときたもんだ。
しかもソースは全部SJISで書かれてる。
XAMPPのローカルでどう動かそう?
拡張子をphpに変えて、先頭一行目のアレを消して、動作テストしてみたけど、全部のファイルでやるワケにはいかんし、ましてアップロード先じゃそれで動いてるから、変に変えるワケにもいかん。
インフラ担当の人が、新しく設置したサーバにApacheとか入れていいと言ってたけど、SJISまみれのソースを入れるに忍びない。
使ってないVMwareをあれこれ起動させて、手っ取り早く使えそうな環境を準備する…
#!/usr/local/bin/php
とかって書いてあるので、パスを調べるがそんなもんねーよ、とlsコマンドが返してくるので、whichで探して、lnコマンドだ。
きっとPHPをCGIとして動作させるためのものだと勝手に理解して、ln -s を実行。
…のはいいけど、言語設定を変えないと。
httpd.confのAddDefaultCharsetはOffにした。
php.iniもあれこれ変更。
mbstring関連で、http_inputとhttp_outputはいずれもpassに変更。internal_encodingも念の為にSJISにして、detect順もSJISを先頭に。あとはAddHandlerとかいろいろ変えて.cgiのPHPが動作するようにしたら…
CSVから読み込んだデータの先頭が文字化け。
どうやらPHP4からPHP5の間で色々とあるらしい。
解決方法も色々あったが、どうもイマイチだ。
ホームサーバ&ホームネットワークメモ php.ini fgetcsv 文字化けで、fgetcsv()を使わずに、fgets()とexplode()で回避してる方法が載ってた。
確かに、ちょっと変えるだけだし…
while ($line=fgetcsv($fp,512)){
これを
while($fdata = fgets($fp, 512)){ $line = explode(",", $fdata);
と、変更する。
…一応、テスト用サーバでは正常に動作した。
しかし、テスト用に拡張子を変更したファイルだとfgetcsv()でも文字化けしないんだよなぁ。
CGIとして動作させることに問題があるのかなぁ?
問題はお客様の環境で文字化けしないってこと。
ここであれこれ手を入れた場合、向こう側で動作しなくなるとか、おかしな動作をするようになる…なんてことも考えられるかななぁ。
そこは今回の修正箇所とは違うし、開き直って放置しとくか。