こんどは、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
よろしければ、試してみてください。
[…] 検索して見つかったのはこちらPHP5 の fgetcsv() で読み込み内容が腐る現象。 要約すると、fgetcsvで読み込む前に文字コードをShift-JISからUTF-8にしましょうというもの。 この方法は自分も思 […]
[…] 参考サイトはこちら ↓ PHP5 の fgetcsv() で読み込み内容が腐る現象 […]
[…] 参考にさせて頂いたサイトはこちら […]
[…] n|\r|\n","\n",$buf); $fp = tmpfile(); fwrite($fp, $buf); rewind($fp); $line = fgetcsv($fp); これはこちらのblog.plastik.jpさんといそぱんさんいうサイトを参考にさせていただきました。まあ今さら言うまでもな […]
[…] 【参考】 PHP5 の fgetcsv() で読み込み内容が腐る現象 (blog.plastik.jp) […]
[…] blog.plastik.jp/archives/6 […]
同じところでハマっておりました。
とても助かりました。
ありがとうございます。
[…] 参考にさせて頂いたサイトはこちら […]