日期:2014-05-17  浏览次数:20390 次

php导出csv文件乱码问题解决方法

php导出csv文件乱码问题解决方法

说 这个问题之前首先来说一下什么是CSV文件?Comma Separator Value(逗号分隔值)是也。常常用来数据转换的中间文件存在,比如:从Mysql中导出数据到CSV,导入CSV到SqlServer中。在 Linux下用PHP脚本从Mysql数据库中将表的数据按照条件导出成csv,使用utf-8编码导出CSV文件,打开后里边的中文成了乱码 (Windows下CSV文件默认与Microsoft Excel关联),用Notepad++或者Word打开正常,不过排版很乱。原因:BOM惹的祸,微软惹的祸。

什么是BOM?Byte Order Mark(比特序标记)是也。

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

?
类Unix系统中并没有使用 BOM,因为它会破坏现有的 ASCII 文件的语法约定。

实现代码如果

<?php
$str = "哈,哈,哈,哈";
$fp = fopen("a.csv","a");
//在写入数据之前先把bom头写到文件里
fwrite($fp,"\xEF\xBB\xBF");
//再写入数据 php程序员站
fwrite($fp,$str);
phperz.com
fclose($fp);
phperz.com
?>

注:在写csv文件时确保php源码是utf-8,并且无BOM,并且没有输出任何内容。


BOM实际上挺烦人,如果你的网页(*.html)有BOM,在IE6.x下面打开会发现一神奇的空行,Firefox下却没有

?

来源:http://www.i-felix.cn/blog/phpdao-chu-csvwen-jian-luan-ma-wen-ti-jie-jue-fang-fa-gai-si-de-wei-ruan

?

?

1 楼 xiaoshenge 2012-09-03  
学习了,以前只知道需要把编码转换一下,原来还有一种简单的方法。
2 楼 天梯梦 2012-09-05  
是的,编码转换有时候不实际!