什么是CSV文件?
CSV文件,全称为Comma Separator Value(逗号分隔值)文件,是一种常用于数据转换的中间文件格式。例如,我们经常从Mysql数据库中导出数据并将其保存为CSV格式。在Web系统中,当我们需要导出报表数据时,也会频繁使用csv格式。这些CSV文件通常采用utf-8编码。但在Windows系统中,如果直接打开这些CSV文件,有时会发现其中的中文内容出现乱码,这通常与文件的编码及与Microsoft Excel的关联有关。用文本编辑器打开则正常,但排版可能不太规整。
那么,什么是BOM呢?
BOM,即Byte Order Mark(字节序标记),是微软定义的一种头部结构。为了识别Unicode文件,Microsoft建议所有的Unicode文件应以ZERO WIDTH NOBREAK SPACE字符开头,作为“特征符”或“字节顺序标记(BOM)”,以识别文件中使用的编码和字节顺序(如big-endian或little-endian)。不同的编码对应的BOM值如下:
UTF-32, big-endian:00 00 FE FF
UTF-32, little-endian:FF FE 00 00
UTF-16, big-endian:FE FF
UTF-16, little-endian:FF FE
UTF-8:EF BB BF
值得注意的是,类Unix系统通常不使用BOM,因为它可能现有的ASCII文件的语法规则。
在PHP中导出CSV文件时,如果只使用file_put_contents或fwrite写入表格数据,而没有按照微软的BOM协议生成相应的BOM信息,那么在生成非Unicode编码(如utf-8)的CSV文件时,Excel可能会默认按照Unicode编码读取,从而导致中文乱码问题。为了解决这个问题,我们可以在PHP代码中添加BOM信息。具体的代码示例如下:
确定你的PHP源码是UTF-8编码。然后,你可以在CSV文件的第一行写入UTF-8对应的BOM信息。代码如下:
$bom = pack(‘CCC’, 0xef, 0xbb, 0xbf); // 生成UTF-8的BOM信息
file_put_contents(‘pythontab.csv’, $bom, FILE_APPEND); // 将BOM信息追加到CSV文件中
file_put_contents(‘pythontab.csv’, $someData, FILE_APPEND); // 接着写入你需要的数据
这样生成的CSV文件在使用Excel打开时就不会出现中文乱码问题了。但需要注意的是,写入的BOM头信息必须和文件的实际编码对应。