« ネット流行語大賞2008データ移行メモ »

fgetcsvでの文字化け

fgetcsvでの文字化け

パーマリンク 2008/11/30 23:56:20 著者: kumaold メール
カテゴリ: プログラミング, PHP

宿泊案内ネットのデータ移行作業を担当することになったので、現行鯖のDBからCSV形式で取り出したデータを新形式に加工した際の苦労をひとつ。


普通にCSV形式のデータを読み込んで、PHPで整形したりする場合よく使うのがこんな感じでexplodeによる切り分けなわけです。

$row = explode(',' $csv);

しかし今回は、データ中にもカンマ(,)が入っているフィールドがあったため、見事にデータが分断されてしまいました。

そこで元からCSVの展開専用の関数fgetcsvを使えばその辺もしっかり対応しているわけですが、見事なまでの先頭文字の文字化け。

三重県→O重県、山口県→R口県、etc... (→ひどい例


そこでこのfgetcsvの使用前に、これを付けるといいらしい。

setlocale(LC_ALL, 'ja_JP');

まあ若干改善されてはいるものの、まだ文字化け箇所がありました。

どうもいろいろ探ってみると、PHP4→PHP5あたりの仕様変更バグ?とか何とか。



結局のところ、こちらにあった改良版のfgetcsv_regにて無事解決しました。

相変わらず、マルチバイト関係では何かと問題があるなぁ。

<?php
    /**
     * ファイルポインタから行を取得し、CSVフィールドを処理する
     * @param resource handle
     * @param int length
     * @param string delimiter
     * @param string enclosure
     * @return ファイルの終端に達した場合を含み、エラー時にFALSEを返します。
     */
    function fgetcsv_reg (&$handle, $length = null, $d = ',', $e = '"') {
        $d = preg_quote($d);
        $e = preg_quote($e);
        $_line = "";
        while ($eof != true) {
            $_line .= (empty($length) ? fgets($handle) : fgets($handle, $length));
            $itemcnt = preg_match_all('/'.$e.'/', $_line, $dummy);
            if ($itemcnt % 2 == 0) $eof = true;
        }
        $_csv_line = preg_replace('/(?:\r\n|[\r\n])?$/', $d, trim($_line));
        $_csv_pattern = '/('.$e.'[^'.$e.']*(?:'.$e.$e.'[^'.$e.']*)*'.$e.'|[^'.$d.']*)'.$d.'/';
        preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
        $_csv_data = $_csv_matches[1];
        for($_csv_i=0;$_csv_i<count($_csv_data);$_csv_i++){
            $_csv_data[$_csv_i]=preg_replace('/^'.$e.'(.*)'.$e.'$/s','$1',$_csv_data[$_csv_i]);
            $_csv_data[$_csv_i]=str_replace($e.$e, $e, $_csv_data[$_csv_i]);
        }
        return empty($_line) ? false : $_csv_data;
    }
?>


参考にしたサイト



[改訂版] PHP ポケットリファレンス (Pocket reference)[改訂版] PHP ポケットリファレンス (Pocket reference)
大垣 靖男

技術評論社 2005-09-17
売り上げランキング : 67001
おすすめ平均

Amazonで詳しく見る
type="text/javascript" src="http://www.ad16.jp/socailmedia.php?a=CCBot%2F2.0+%28http%3A%2F%2Fcommoncrawl.org%2Ffaq%2F%29&u=http%3A%2F%2Fkuroutoshikou.blog16.jp%2Findex.php%2F2008%2F11%2F30%2Ffgetcsva_sa_ra_as_a_a" charset="EUC-JP">

一六社で働くITエンジニアのブログ。

普段はWeb系システム開発と地元のPCサポートをやってます。いつの間にやら会社に8年目。
技術ネタ中心に日々の仕事と生活と趣味やらを気が向いたら書いてます。

2017年5月
 << <   > >>
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

検索

XMLフィード

16ブログ     blog tool