php 数据导出excel时的那些坑

php 数据导出excel时的那些坑_第1张图片

因为需求简单,只需要导出成表格,所以是这么写的,通过发送header头实现文件下载(多说一句,header中可以实现的功能很多,有兴趣的童鞋可以深度发掘)。一开始没什么问题,结果游戏上线几天,玩家数据多起来之后,再想将数据导出,就这样了:

php 数据导出excel时的那些坑_第2张图片

而且至今为止,我都不知道为什么数据量大之后就会出现这种情况,难道iconv处理的字符串长度有上限?没有去深究。

问题出来了就要解决,过程就不提了,无非谷歌,实践,再谷歌,再实践,直接上代码:

header("Content-Disposition:filename=".$filename.".csv");
$strexport= "\xEF\xBB\xBF".$csvtext;
exit($strexport);

这么写的原因是什么呢?
1.因为转码有问题,并且我通过对比远端数据编码格式,程序本身编码格式,文件格式均为utf-8,那我干脆去掉了第一张图中的编码转换,但是却发现windows环境下跑代码下文件没问题,linux生产环境又出现了乱码问题

2.要说这个问题得先聊点其他东西:

 什么是BOM?  这里直接上图
php 数据导出excel时的那些坑_第3张图片

看完红框中的大字大家是不是理解点什么了。对,微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的, 然而这个只是微软暗自作的标记, 其它平台上并没有对UTF-8文本文件做个这样的标记。你微软搞这套,本意是好的,但奈何其它系统并不买账啊,linux就是其中之一,所以导出的文件没有BOM,所以在欲导出的内容前加上utf-8的BOM,就解决了文件打开乱码问题。

你可能感兴趣的:(PHP,linux)