fgetcsv関数を文字化け対応 setlocaleの文字コード指定

PHP5でCSVファイルに日本語などマルチバイト文字が含まれるものをfgetcsv()関数で配列に入れるとき、日本語文字が消えるまたは一部消えることがあります。
PHP5になってから発生する事象ですが、これはPHP5のバグではありません。設定場所が変わっただけです。

たとえばCSVで次のようなデータがあったとします。

ID,名前,都道府県ID,電話番号or携帯番号

これをfgetcsv()関数で読み込むと

Array(
    [0] => ID,
    [1] => ,
    [2] => ID,
    [3] => or携帯番号,
)

となります。
全て日本語文字の場合は消えて、一部日本語文字の場合は先頭の日本語文字が消えます。

この現象はPHP4ではおこらず、PHP5で発生します。またwindowsサーバではPHP5でも発生しないことがあります。

fgetcsv()関数の文字コードの指定は、mb_language("ja")やmb_internal_encoding("UTF-8")ではできません。
mbstring関数ではないので、当然といえば当然です。

PHP5のfgetcsv()関数はロケールの設定に依存するため、で文字コードを指定するにはsetlocale()を使用します。

ただ次のようにしてしまうと、先頭1文字の日本語文字のみが消えます。

setlocale(LC_ALL,'ja_JP');

対処法は、エンコードも指定します。

setlocale(LC_ALL, 'ja_JP.UTF-8');

setlocale(LC_ALL, 'ja_JP.EUC-JP');

setlocale(LC_ALL, 'ja_JP.Shift_JIS');

このようにすることで、文字が欠けることなくfgetcsv()関数で配列にすることができます。

またこの現象は、文字列が『 " (ダブルクオート)』で囲われてない場合に起こるようです。

この対処法をしない場合は、自前でCSVデータを読み取る必要があります。
CSVの仕様はRFC4180になりますが、Excel形式のCSVはまた違います。

fgets()とexplode(",", $data)のみで対応しているパターンがありますが、この場合 囲み文字のダブルクオートやセル内の改行に対処できません。

関連記事

スポンサーリンク

EXCEPT演算子 差集合を計算する

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る