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

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

虐人心 发布于 2017-08-13 字数 61 浏览 1273 回复 5

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

浮生未歇 2017-10-16 5 楼

输出前要标明编码格式,只要编码统一了就肯定没问题

 $filename = $iconv->convert('UTF8', 'GB2312', $filename );
header("Content-type: application/vnd.ms-excel; charset=GB2312");
header("Content-Disposition: attachment; filename=$filename.xls");

瑾兮 2017-10-09 4 楼

为了识别 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;
}

归属感 2017-09-30 3 楼

<?php
function writeCsvToFile($file,array $data){
$fp = fopen($file, 'w');

//Windows下使用BOM来标记文本文件的编码方式
fwrite($fp,chr(0xEF).chr(0xBB).chr(0xBF));

foreach ($data as $line) {
fputcsv($fp, $line);
}

fclose($fp);
}

$file = "./testcsv.csv";
$data = array(
array(1,'色色',12345,'vb200'),
array(1,'色色',12345,'vb200'),
array(1,'色色',12345,'vb200'),
array(1,'色色',12345,'vb200'),
array(1,'色色',12345,'vb200'),
array(1,'色色',12345,'vb200'),
array(1,'色色',12345,'vb200'),
array(1,'色色',12345,'vb200'),
array(1,'色色',12345,'vb200'),
array(1,'色色',12345,'vb200'),
array(1,'色色',12345,'vb200'),
array(1,'色色',12345,'vb200'),
array(1,'色色',12345,'vb200'),
array(1,'色色',12345,'vb200'),
array(1,'色色',12345,'vb200'),
array(1,'色色',12345,'vb200'),
array(1,'色色',12345,'vb200'),
);

writeCsvToFile($file,$data);

归属感 2017-09-10 2 楼

 $str = iconv('utf-8','gb2312',$str);

指定文件编码后,转换数据内容编码

夜无邪 2017-08-30 1 楼

在你要输出的内容前先输出"xEFxBBxBF",例如:你要输出的内容保存在$content里
$content = "xEFxBBxBF".$content; //添加BOM
确保输出$content前没有任何其他东西输出。
何为BOM,它是Windows用来标记文本文件的编码方式的,你可以在网上查查相关BOM资料。