Home  >  Article  >  Backend Development  >  解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的有关问题

解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的有关问题

WBOY
WBOYOriginal
2016-06-13 13:13:51912browse

解决PHP生成UTF-8编码的CSV文件用Excel打开乱码的问题

写道
其实这个问题很久之前遇到过, 应该是没解决, 当时的情况是openoffice打开正常而excel打开不正常, 后来也没解决了, 只能把编码转了.

这次又遇到这个问题了, 在网上一番寻找, 在一篇java的文章里找到了原因, 是由于输出的CSV文件中没有BOM.

什么是BOM?

在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little- Endian的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BOM。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
Windows就是使用BOM来标记文本文件的编码方式的。

那么如何在PHP中输出BOM呢?

在所有内容输出之前

print(chr(0xEF).chr(0xBB).chr(0xBF)); ?
<?php

function writeCsvToFile($file,array $data){
	$fp = fopen($file, 'w');
	
	//Windows下使用BOM来标记文本文件的编码方式
	fwrite($fp,chr(0xEF).chr(0xBB).chr(0xBF));
	
	foreach ($data as $line) {
		fputcsv($fp, $line);
	}
	
	fclose($fp);
}

$file = "./testcsv.csv";
$data = array(
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
	array(1,'色色',12345,'vb200'),
);

writeCsvToFile($file,$data);
?
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn