PHPのfputcsvのデキが悪いので、自作関数を作る必要があるようだ。
mb_str_replace.phpが必要なのでダウンしておく。
- 1と2番目の引数はオリジナルのfputcsvと同じ。最初がファイルポインタ、次が値の配列
- 3番目は対象データの文字コード。省略時は内部エンコーディング(mbstring.internal_encoding)
- 項目は全てダブルクォーテーションで括られます
- 項目内のダブルクォーテーションはダブルクォーテーションでエスケープされます
function _fputcsv($fp, $data, $encoding="") { require_once 'mb_str_replace.php'; $csv = ''; foreach ($data as $col) { $col = mb_str_replace('"', '""', $col, $encoding); $csv .= "\"$col\","; } $csv = preg_replace("/,$/", "", $csv); fwrite($fp, "$csv\r\n"); }
参考サイト
http://techracho.bpsinc.jp/baba/2010_03_01/1172
http://fetus.k-hsu.net/document/programming/php/mb_str_replace.html
fgetcsv+Shift-JIS
SJISのCSVをfgetcsvで読み込んでも、まず間違いなくバグる。
EUCやUTF-8のCSVなら上手くいく。
というわけで、CSVファイルを開く時に文字コードを変換してからfgetcsvを使ってみたらどうか。
$fp = fopen("php://filter/convert.mbstring.encoding.SJIS-win:UTF-8/resource=example.csv", "r");