[PHP]CSVを読み込み時、文字化けさせないで読み込む方法とは!?

php

PHPを利用してCSVを読み込んだり書き込んだりする処理はよくあると思います。ただそれ以上にCSVを読み込むと文字化けするという事もあると思います。

まぁだいたいプログラムとかhtmlを書くときって文字コードがUTF8なんですけど、幸か不幸かCSVファイルを開くのにエクセルがよく利用されると思いますがエクセルでCSV形式で保存するとSJISになってしまうんですよね。もうなんなだこの仕様は(笑)
そんな訳で、CSVファイルを読みこんで表示させる時に文字化けしないように処理しましょうっていうのか今回の目的です。

PHPでどう処理するのか?

fgetcsv() を利用して読み込んだりするとmb_convert_variables() を使って配列の文字列を変換するか、mb_convert_encoding() を使ってループ内で一行ずつ文字コードを変換していく方法があります。

今回は、file_get_contents()とtmpfile()を利用した方法をメモしていこうかと思います。

この方法だとmb_convert_encoding() を一回使うだけでエンコードの異なる CSV ファイルの読み込みができるので効率的だとういうことですね。

CSVを読み込みファイルを表示する

とりあえずは、CSVファイルを読みこんで表示するまでのコードを記載します。

file_get_contentsで読み込む

file_get_contents()はファイルの内容を全て文字列に読み込む関数なので、一旦すべての内容を読み込みます。

mb_convert_encodingで一気に文字コードを変換する

sjis-winからUTF8へ文字コードを変換したデータを再度、変数に戻します。

一時ファイルを作成して文字コードを変換したデータを書き込む。

tmpfile関数を利用して一時ファイルを作成します。

その後、先ほど文字コードを変換した「$data」のデータをfwrite()を利用して書き込みます。rewind()でファイルポインタを先頭に戻します。

一時ファイルのデータを再度CSVとして読み込む

一時ファイルをfgetcsv()を利用してCSVとして読み込みし、新しい配列にデータをいれます。

最後は、for文を利用して配列のデータの中身を表示しています。*ちなみにCSVファイルは1行のデータ数と、その1行のデータの詳細(サンプルでは商品名とブランド)の配列とで2次元配列となっています。