PHP 生成 csv 用 Mac excel 打开乱码

PHP生成 csv 格式 遇到的坑


坑之始

一、 在项目中有一个功能是把数据库中的数据导出来,没有说什么格式。 我就开始在网上遨游,怎么样最简单的导出数据,发现csv 可以转换为excel 并且生成非常简单,于是乎开干。

  1. 先从数据库中查出数据,这个最简单,不多赘述。
  2. 首先我们了解什么是csv格式:
    CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。
    最广泛的应用是在程序之间转移表格数据,而这些程序本身是在不兼容的格式
    上进行操作的(往往是私有的和/或无规范的格式)。因为大量程序都支持某
    种CSV变体,至少是作为一种可选择的输入/输出格式。
  3. 原来csv 这么简单,PHP的生成方法更简单:

    $arr = [
       [
           'a' => '1',
           'b' => '2',
           'c' => '3',
       ],
       [
           'a' => '12',
           'b' => '22',
           'c' => '32',
       ],
    ];
    $str = "第一列,第二列,第三列\n";
    foreach( $arr as $k => $v){
        $str .= "{$v['a']},{$v['b']},{$v['c']}\n";
    }
    
    header("Expires:0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("content-disposition: attachment;filename={$file_name}");
    header( "Cache-Control: public" );
    header( "Pragma: public" );
    header( "Content-type: text/csv" ) ;
    header( "Content-Dis; filename=1.csv" ) ;
    echo $str;

上面的$str 内容 写入文件就是一个csv格式文件,可以导入excel。 个人认为比生成excel 文件简单。我用wps 直接打开即可,可是当我用Mac的excel打开时,会显示在一列中,还是用逗号隔开,并且乱码了。用导入功能选择不同编码 还是乱码。

坑之解

网上遍寻资料,其中有说因为没有BOM头,导致的。 所以加上:

echo chr(239).chr(187).chr(191);

最后打开还是不行,我猜测是因为,导入时已经测试选择 utf8 编码了,这里虽然指定,最终还是 utf8 ,所以还是乱码。 最后用了编码转换,把 utf8 转换为 gbk :

把最后一行代码修改成:
 echo iconv('utf-8', 'gbk//IGNORE', $str);

最终,用这种方式,竟然导入成功,也没有乱码。难道是gbk比 utf8 好(这个是不可能的)。 实际上可能是都在中国区域,默认可能是 ansii (gb10080或者gb2312或者gbk)用utf8 反而不美了,或者可能Mac的utf8编码版本问题。

阿杰博客
请先登录后发表评论
  • latest comments
  • 总共0条评论