• 如何解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题


    为了识别 Unicode 文件,Microsoft 建议所有的 Unicode 文件应该以 ZERO WIDTH NOBREAK SPACE字符开头。这作为一个”特征符”或”字节顺序标记(byte-order mark,BOM)”来识别文件中使用的编码和字节顺序(big-endian或little-endian),具体的对应关系见下表。

    Bytes Encoding Form
    00 00 FE FF UTF-32, big-endian
    FF FE 00 00 UTF-32, little-endian
    FE FF UTF-16, big-endian
    FF FE UTF-16, little-endian
    EF BB BF UTF-8

    以UTF-8无BOM格式编码,因此要想导出Microsoft Excel可以正常显示的UTF-8的CSV文件,需要显式的输出BOM(EF BB BF,上表的最后一种类型),然后再输出Mysql中的有效数据。编写如下函数:

    function output_csv($file_name,$content)
    {
    $content = "/xEF/xBB/xBF".$content; //添加BOM
    if( empty( $file_name ) )
    {
    $file_name = date("Ymd")."csv";
    }
    header( "Cache-Control: public" );
    header( "Pragma: public" );
    header( "Content-type: text/csv" ) ;
    header( "Content-Disposition: attchment; filename={$file_name}" ) ;
    header( "Content-Length: ". strlen( $content ) );
    echo $content;
    exit;
    }

    上面的方法是添加BOM的一种解决方案。还有一种解决方案是改变字符集为gb2312。代码如下:

    $content = iconv('utf-8','gb2312',$content);
    header("Content-type: application/vnd.ms-excel; charset=GB2312");
    header("Content-Disposition: attachment; filename=$filename.xls");

    echo $content; exit;

    以上两种方案优先选择第一套,第二套改变字符集为gb2312,可能会不支持汉字中中的一些生僻字。

  • 相关阅读:
    shell的正则表达式
    shell语法
    shell通配符
    shell小命令
    DNS
    CCNA参考链接
    Network problem solving flow chart
    我是一个路由器
    我是一个网卡
    Chrome
  • 原文地址:https://www.cnblogs.com/Life-Record/p/5593068.html
Copyright © 2020-2023  润新知