Fgetcsv 中文乱码

PHP相关的函式真的是很多,而且都蛮简单操作的

单单要读CSV档,只要透过fgetcsv 函式就可以处理,而且还可以把扰人的双引号问题一併排除,不过在使用时,发现中文的处理上有一些瑕疵。

上网找了一些资料,针对此问题有蛮多解法,不过还是要看一下问题发生原因。

1.如果你的资料档是big5,就要在读入时进行iconv or mb_convert_encoding 转成UFT-8才能使用。

2.如果你都是utf-8还遇到问题,就是fgetcsv 的问题啦(我就是这个啦)。

所以找到一篇有人重写了fgetcsv ,试用后发现问题排除了,所以也分享一下解法。[code]function __fgetcsv(&$handle, $length = null, $d = “,”, $e = ‘"’) {
$d = preg_quote($d);
$e = preg_quote(e); _line = “”;
$eof=false;
while (eof != true) { _line .= (empty ($length) ? fgets($handle) : fgets($handle, $length));
$itemcnt = preg_match_all(‘/’ . e . '/', _line, $dummy);
if ($itemcnt % 2 == 0)
eof = true; } _csv_line = preg_replace(‘/(?: |)?$/’, d, trim(_line));
$_csv_pattern = ‘/(’ . $e . ‘[^’ . $e . ‘](?:’ . $e . $e . ‘[^’ . $e . '])’ . $e . ‘|[^’ . $d . '])’ . d . '/'; preg_match_all(_csv_pattern, _csv_line, _csv_matches);
_csv_data = _csv_matches[1];

for ($_csv_i = 0; $_csv_i < count($_csv_data); $_csv_i++) {
    $_csv_data[$_csv_i] = preg_replace("/^" . $e . "(.*)" . $e . "$/s", "$1″, $_csv_data[$_csv_i]);
    $_csv_data[$_csv_i] = str_replace($e . $e, $e, $_csv_data[$_csv_i]);
}
return empty ($_line) ? false : $_csv_data;

}[/code]经过使用上面的函式,中文字解析出来,字首不会再是乱码了,但有点要特别注意的,如果你后方有带很多空值的栏位,他会一併清除,这和原本的fgetcsv 不太一样,在转换时要特别注意。