主页 > PHP教程 > 正文

处理PHP导出CSV文件中文乱码问题

什么是CSV文件?

英文名:Comma Separator Value(逗号分隔值),常用来数据转化的中心文件存在,比方:从Mysql中导出数据到CSV中。在web体系中常常遇到要导出报表数据,也会用到csv格局,运用utf-8编码导出CSV文件,翻开后里面的中文成了乱码 (Windows下CSV文件默许与Microsoft Excel相关),用文本编辑器翻开正常,不过排版很乱。原因:短少BOM,又是微软弄巧成拙。

什么是BOM?

Byte Order Mark(比特序符号),微软界说的一种头部结构。

为了辨认 Unicode 文件,Microsoft 主张一切的 Unicode 文件应该以 ZERO WIDTH NOBREAK SPACE字符最初。这作为一个”特征符”或”字节次序符号(byte-order mark,BOM)”来辨认文件中运用的编码和字节次序(big-endianlittle-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导出csv文件时, 假如只运用file_put_contents 或许 fwrite 写入了表格数据, 而咱们生成csv的渠道不一定遵从微软的bom协议,导致假如输出非unicode编码的csv文件(例如utf-8),而且没有生成bom信息的话,Excel主动依照unicode编码读取,就会呈现乱码问题了。而没有写入BOM头信息,就会呈现翻开中文乱码的状况。

PHP中文乱码处理

Excel在读取csv的时分是经过读取文件头上的bom来辨认编码的,假如文件头无bom信息,则默许依照unicode编码读取。

假如想运用utf-8格局,保证php源码是utf-8,咱们能够在榜首行写入utf-8对应的BOM信息

代码如下:

$bom = pack('CCC', 0xef, 0xbb, 0xbf); // 和上面的对应
file_put_contents('pythontab.csv',$bom, FILE_APPEND);
file_put_contents('pythontab.csv',$someData, FILE_APPEND); //写入你想要写入表格的数据

前后都省掉了部分代码, 只写了最要害的部分, 其它部分咱们自行弥补即可。

这样生成的csv就不会呈现中文乱码问题啦。

留意:写入的BOM头信息要和文件的编码对应。


上一篇:PHP正则表达式形式修饰符详解
下一篇:最终一页

PythonTab微信大众号:

Python技能交流合作群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854