1月 25, 2006 13

PHP5 の fgetcsv() で読み込み内容が腐る現象

By in PHP

こんどは、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);

手順としては、

  1. CSV ファイルを一度読み込む
  2. 文字コードをコンバート
  3. テンポラリファイルを作成
  4. コンバートした内容を書き込む
  5. 書き込んだファイルの、ファイルポインタを先頭に戻す
  6. で、fgetcsv で読み込みを行う

これでうまくいった。
コード+4行で動作するのならば、まーいいかな…とは思うけど、相変わらず泥臭い対処方法だと思う。

13 Responses to “PHP5 の fgetcsv() で読み込み内容が腐る現象”

  1. ハヤブサ より:

    はじめまして SOHOさん

    同じところで、はまっていました。

    このブログを見つけて、たいへん助かりました!
    ありがとうございます。

  2. plastik より:

    いえいえとんでもないです!
    ちょっと強引な対策でしたが、お役に立てて何よりです。

  3. あきら より:

    こんな方法もあります。

    http://akira.matrix.jp/index.php?date=2007-09-18

    お試しください。

  4. […] 参考サイト様は、 fgetcsv() の使い方 - PHPマニュアル PHP5 の fgetcsv() で読み込み内容が腐る現象 - blog.plastik.jp […]

  5. yurihichi より:

    こんな方法も考えてみました。
    http://scripting.blog49.fc2.com/blog-entry-11.html
    よろしければ、試してみてください。

  6. […] 検索して見つかったのはこちらPHP5 の fgetcsv() で読み込み内容が腐る現象。 要約すると、fgetcsvで読み込む前に文字コードをShift-JISからUTF-8にしましょうというもの。 この方法は自分も思 […]

  7. […] 参考サイトはこちら ↓ PHP5 の fgetcsv() で読み込み内容が腐る現象 […]

  8. […] n|\r|\n","\n",$buf); $fp = tmpfile(); fwrite($fp, $buf); rewind($fp); $line = fgetcsv($fp); これはこちらのblog.plastik.jpさんといそぱんさんいうサイトを参考にさせていただきました。まあ今さら言うまでもな […]

  9. […] 【参考】 PHP5 の fgetcsv() で読み込み内容が腐る現象 (blog.plastik.jp) […]

  10. […] blog.plastik.jp/archives/6 […]

  11. hyt より:

    同じところでハマっておりました。
    とても助かりました。
    ありがとうございます。

Leave a Reply