php处理csv乱码问题

来源:互联网 发布:男生宿舍捅死同学知乎 编辑:程序博客网 时间:2024/06/05 17:37

csv是comma separter value的缩写,其档案类型是「逗号分格」,用来存储一些地址薄不错,依计算机原来的设定,如果直接点选该档案,计算机将以EXCEL的模式开启该档案.但这样做的后果是出现中文乱码,因为csv档如果以EXCEL开启,由于计算机档案数据转换的原因,会将其CRC之数值改做科学记号方式储存,而造成档案中的 CRC值发生错误.后果很严重...不过你可以用记事本或者用word来打开它,这样打开是没有乱码的,但那些排版就乱七八糟了...看得很不爽...
      究其根本,就是csv不能打开utf-8编码的文档,而记事本和word则可以...
      而用PHP来编写支持多国语言网页的时候,数据交换时用utf-8会很方便,但这样一来就跟cvs冲突了
     
先参考一个从网上找来的例子:

<?php
$T_text = '要输出的CSV文件';

header('Cache-control: private');
header('Content-Disposition: attachment; filename=test.csv');
//如果mb_convert_encoding函数存在则用此函数来转编码,前提是需要安装mbstring包
if(function_exists('mb_convert_encoding')){
    header('Content-type: text/csv; charset=UTF-16LE');
    echo(chr(255).chr(254));
    echo(mb_convert_encoding($T_text,"UTF-16LE","UTF-8"));
}
//如果iconv函数存在则用此函数来转编码
elseif(function_exists('iconv')){
    header('Content-type: text/csv');
     echo(chr(255).chr(254));
    echo(iconv("UTF-8","UTF-16LE",$T_text));
}
//直接从utf-8转,这个貌似不灵...
else{
    header('Content-type: text/csv; charset=UTF-8');
    echo(chr(239).chr(187).chr(191));
    echo($T_text);
}
?>
例子上完了,但这样并不会将我的网页转换乱码成功,为什么我不知道,但我从中得到了启发

下面来两个函数,expChangeCode是导出时将utf-8格式编码转换成cp936,cp936是gbk的另一种说法.而impChangeCode则是导入时将cp936格式编码转换成utf-8,而上面例子上的chr(255).chr(254)则是给文档加一个bom(貌似微软文档专用,靠..)在下面两个函数中则不使用了,因为加上会造成中文字体消失.我也就是因为这个东东搞到半死...
function expChangeCode($str)
{
        $str = mb_convert_encoding($str,"CP936","UTF-8");
        return $str;
}

function impChangeCode($str)
{
        $str = mb_convert_encoding($str,"UTF-8","CP936");
        return $str;
}
用的时候也很简单,只要echo expChangeCode($str)就可以将没有乱码的csv格式的文档输出来了,输入因为程序不同,自己去用例子测试了...