PHPのfgetcsvでMacのやつやSJISのやつを扱うとき

4月 27th, 2008 admin Posted in PHP, 今日のコード | 2 Comments »

PHPにはCSVを処理してくれるfgetcsvという便利な関数があって、これを使えばダブルクォーテーションとかの処理は考えなくていいようになります。ただし

  • CRの改行コードに対応していない
  • SJISだと、いわゆる5C問題にひっかかる

という問題があるので、CSVファイルを扱うときはいきなりfgetcsvで読み込むのでなくいったんファイルを作成して、それを読み直すのがよいと思います。以下がファイルを読み込んで改行コードと文字コードを変換してfgetcsvで読み直すサンプルです。

コード

PHP:
  1. $file = file_get_contents("アップロードされたファイルのパス");
  2. $file = ereg_replace("\r\n|\r|\n","\n",mb_convert_encoding($file,"UTF-8","SJIS-win"));
  3. $fp = tmpfile();
  4. fputs($fp,$file);
  5. fseek($fp,0);
  6.  
  7. while($o = fgetcsv($fp,1024)){
  8.   //処理
  9. }

2 Responses to “PHPのfgetcsvでMacのやつやSJISのやつを扱うとき”

  1. [...] PHPのfgetcsvでMacのやつやSJISのやつを扱うとき 「mb_convert_encoding」をする前に「ereg_replace」で文字置換でしてやって、その置換後のファイルを改めてエンコーディングするってことです。 ふ~そうなんや~って感じです。 macとwin やっぱり色々違うもんです。 [...]

  2. [...] を使うときの注意 http://www.jamboree.jp/cms/archives/146 カテゴリー: PHP   パーマリンク ← Perl: [...]