PHP 第16章 utf8编码的php导出CSV乱码 PHP 第16章 utf8编码的php导出CSV乱码

2023-04-12

其实需求是把数据导出到 Excel,很当然的想到大名鼎鼎的 PHPExcel 这个库。

这个库是很强大,就是比较占用内存,超过 10 万的数据,在web请求中基本是很难完成了。

因此,使用原生 PHP 导出轻量的 csv 还是有需求的。

一般情况下,导出 UTF-8 编码的常规内容到 csv 当中,用 Excel 打开都是乱码,更别说一些非主流字符,或者是emoji 表情。乱码,是因为在 windows 系统下,默认的 Excel 是使用 GBK 编码解析的。现如今,编码哪还有不是使用 UTF-8 的,真有,那也是大公司知名产品会为了省那点流量出有 GBK 等其他编码的版本,一般情况下都是使用UTF-8 的。

要解决乱码问题,PHP 中做法一般是使用 iconv 函数进行转码为 GBK,这样,默认的 Excel 打开就不会有问题了。但对于 emoji 表情等主流字符,GBK 并不能显示,转码失败直接为空了。可以添加 //IGNORE 标记进行忽略,这样只是忽略了它们,其他正常字符是能够保留的。

$str = iconv('utf-8', 'GBK//IGNORE', $str));

这可以说是一种折中方案。能不能不转码直接输出 UTF-8?难道 Excel 还不能自动识别 UTF-8 进而使用 UTF-8 来解码显示么?其实是可以的,只是它需要一个 BOM 头(在非 windows 的世界里是没有这个东西的),有这个 BOM头它就能识别到是 UTF-8,否则识别不了用默认的 GBK 来处理,自然就是乱码了。如何正确输出所谓的 BOM头,看代码:

$fp = fopen('./test_csv.csv', 'a');
fwrite($fp,chr(0xEF).chr(0xBB).chr(0xBF));//输出BOM头
fputcsv($fp, ['标题']);
fputcsv($fp, ['解决乱码']);
fclose($fp);

以上亲测,可以解决所谓乱码以及正常显示 emoji 表情等非主流字符。

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开微信扫一扫,即可进行扫码打赏哦

阅读 314