PHPで文字化けせずにCSVファイルを読み込む方法

CSVを読み込むと「文字化けしている…」ってことがよくありますよね。そんな時の対処法です。

文字化けせずにCSVファイルを読み込む

まず、SplFileObjectでCSVファイルを読み込みます。

fgetcsv()でもいいのですが、参考にさせて頂いた「【PHP】その CSV 変換、本当に「fgetcsv」でいいの?」によると、一番速くメモリの使用量も少ないのはSplFileObjectだそうなのでコレを使います。

また、エンコーディングは文字列ではないのでmb_convert_encoding()ではなく、mb_convert_variables()を使ってUTF8にエンコードします。

/**
* CSVから配列を作成する関数
*
* @param $csv string CSVファイルのパス
* @return $array array UTF8エンコード済の配列
*/
function csv_to_array($csv) {
  $file = new SplFileObject($csv);
  $file->setFlags(SplFileObject::READ_CSV);
  $array = array();
  foreach ($file as $line) {
    //空行はスキップ
    if (empty($line)) continue;
    $array[] = $line;
  }
  mb_convert_variables("UTF-8", array("ASCII","JIS","UTF-8","EUC-JP","SJIS"), $array);
  return $array;
}

こんな感じで読み込めます。

$data = csv_to_array("ファイル名.csv");