fgetcsvの履歴
PHPのCSV読み込む関数。
ロケールによって文字コードの処理の仕方が違う
setlocale(LC_ALL, 'ja_JP.UTF-8');
とすればOK
WindowsではできたけどUnixでは動かない場合や、日本語だけうまく入らない場合はロケールが間違ってる可能性がある。
これをやっても全角英字や「~」が文字化けする!!
使うな、との声多数なのでもうこの関数は信用しない!というわけで自作した。
簡単なテストは通ったけど、よく見たらエスケープの処理が怪しいかも
<?php class Mindia_Csv{ private $data = array(); private $separator = ","; function toArray(){ return $this->data; } function parse($string){ $len = mb_strlen($string); $row = array(); $col = ""; $quoted = false; $prev = ""; for ($i = 0; $i < $len; $i++){ $char = mb_substr($string, $i, 1); if ($char === "\n" && !$quoted){ $row[] = $col; $this->data[] = $row; $row = array(); $col = ""; }else if ($char === "\r"){ }else if ($char === $this->separator && !$quoted){ $row[] = $col; $col = ""; }else if ($char === '"'){ if ($prev === $char){ // escape quote $col .= '"'; }else{ if ($quoted){ // end quote $quoted = false; }else{ // start quote $quoted = true; } } }else{ $col .= $char; } // to detect escape quote $prev = $char; } if (!empty($row) || $col !== ""){ $row[] = $col; $this->data[] = $row; } } }