多语言展示
当前在线:261今日阅读:113今日分享:31

PHP读取csv时,读取中文乱码问题解决方法

我们在php web开发过程中,经常会在导入csv时,使用到php系统自带的fgetcsv()函数,但是读取中文却会出现乱码现象。本文从windows和linux两个操作系统中告诉大家解决这个问题的方法。
工具/原料
1

开发工具hbuilder

2

csv文件一个

方法/步骤
1

首先讲linux,不管是centos或者Ubuntu。在导入csv的php脚本文件头部加上如下代码:setlocale(LC_ALL,array('zh_CN.gbk','zh_CN.gb2312','zh_CN.gb18030'));这段代码的作用是改变脚本默认编码,因为操作系统的编码格式不是GBK所以,读取中文的时候会乱码。

2

接着讲windows,我们在读取csv数据的时候,会有一个while循环遍历每一行的数据,而读取的每一行数据,就需要我们进行转义,将中文编码读取出来。代码如下:$row = eval('return '.iconv('gbk','utf-8',var_export($row,true)).';');$row,就是读取出来每一行的数据变量。

3

最后,贴一个fgetcsv()方法的替代函数,这种是针对有些老版本的php该函数自带着一些bug的情况。如果上边两点还是没办法解决您的问题,您可以尝试一下使用该函数,与前边两点配合使用。function fgetcsv_reg(& $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; }

注意事项

最好步骤1,2,3同时使用。因为我们也不确定最后的生产环境到底是什么样子的

推荐信息