こんどは、PHP5.1.2 の fgetcsv() ではまった…
fgetcsv() で読み込もうとする csv ファイルの文字コードと、PHP の内部文字エンコーディングが違う場合、fgetcsv() で読み込むと、どうしても文字が腐る …
(PHP4 時代[少なくとも 4.3 系統は]は、問題なかった)
【以下みたいな場合】
- CSV: Shift_JIS (Windows の Excel で作成されることを想定するとこれ)
- PHP内部コード: UTF-8 (最近は自分プロジェクトはこれで統一している)
で、試しに、CSV のエンコードを UTF-8 にして試すと、うまくいんだよなぁ。
色々調べると、PHP5 からどうやらロケール? に左右されるらしい… (参照URL: PHP-devML)
ただ、上記 ML のスレッドでも解決方法(いや解決してないようだが)を試しても、やっぱりダメ。
なら、PHP を ShiftJIS にすればいいじゃん!と思ったが、さすがにそれはプログラマとしてするわけにはいかない。
なので、そもそもバグなのかはわからないけど、いずれ修正されることを期待しつつ、今回も力業で取り急ぎの対処。以下、ソースコードと手順。
$buf = mb_convert_encoding(file_get_contents(“$CSV FilePath”), “utf-8″, “sjis”);
$fp = tmpfile();
fwrite($fp, $buf);
rewind($fp);
手順としては、
- CSV ファイルを一度読み込む
- 文字コードをコンバート
- テンポラリファイルを作成
- コンバートした内容を書き込む
- 書き込んだファイルの、ファイルポインタを先頭に戻す
- で、fgetcsv で読み込みを行う
これでうまくいった。
コード+4行で動作するのならば、まーいいかな…とは思うけど、相変わらず泥臭い対処方法だと思う。



はじめまして SOHOさん
同じところで、はまっていました。
このブログを見つけて、たいへん助かりました!
ありがとうございます。
いえいえとんでもないです!
ちょっと強引な対策でしたが、お役に立てて何よりです。
こんな方法もあります。
http://akira.matrix.jp/index.php?date=2007-09-18
お試しください。
[...] 参考サイト様は、 fgetcsv() の使い方 - PHPマニュアル PHP5 の fgetcsv() で読み込み内容が腐る現象 - blog.plastik.jp [...]
こんな方法も考えてみました。
http://scripting.blog49.fc2.com/blog-entry-11.html
よろしければ、試してみてください。