2009年05月18日(月) 19:36 | posted by shin2 | Comments [0]

fgetcsv()で文字化け。

PHPでfgetcsv()を使用してCSVファイルを読み、2次元配列に格納したときに日本語の部分が文字化けたのでメモ。(しかも先頭から5文字ぐらいだけ)
調べてみると、よう分からんけどPHP5.0でfgetcsv()の仕様がが変わったとかなんとか…。
ロケール設定を考慮するようになったとかなんとか…。

で、確認してないけど一応対策らしきものがあるみたいだ。
csvファイルのデータの日本語の部分を「”」で囲うと文字化けしないとか。fgetcsv()の前にsetlocale(LC_ALL, ‘ja_JP.eucJP’);を設定するとか(CSVファイルの文字コードを選ぶらしいからいまいち?)。
その他に、fgetcsv_reg()という関数をfgetcsv()のかわりに自作して、解決してくれている人がいるみたいです。使い勝手が変わらなくて良いみたい。

結局、2次元配列になればなんだっていいので、file()とexplode()で対応。

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
32
33
34
35
<?php
///CSV読み込み
$2d_array = LoadCsv(CSV_FILE_PATH);
 
function LoadCsv ($filepath, $enc_set='EUC-JP', $enc_base='SJIS') {
 
	if (!file_exists($filepath)) {
		return false;
	}
 
	if (count($filepath)<1) {
		return false;
	} else {
		$array = file($filepath);
		for ($i=0; $i<count($array); $i++) {
			$array[$i] = ereg_replace("\n$", "", $array[$i]);
			$array[$i] = ereg_replace("\r$", "", $array[$i]);
			$array[$i] = explode(',', $array[$i]);
			$array[$i] = array_mb_encoding($array[$i], $enc_set, $enc_base);
		}
		return $array;
	}
 
}
 
//配列のデータを出力に合わせてエンコード
function array_mb_encoding($array, $enc_set, $enc_base) {
 
	for ($i=0; $i<count($array); $i++) {
		$array[$i] = mb_convert_encoding($array[$i], $enc_set, $enc_base);
	}
	return $array;
 
}
?>

[この記事へのトラックバックURL]
http://www.mujuu.org/weblog/web_memo/211/trackback

COMMENTs