在做项目时碰到使用外语的情况下,我们就会使用utf-8编码。但是,在用php导出csv文件时,如果写入的数据是使用utf-8编码的日语、韩语之类的外文,就会出现乱码。
要解决php生成csv文件的乱码问题,只需要在文件的开始输出bom头,告诉windows csv文件的编码方式,从而让excel打开csv时采用正确的编码。
相关推荐:《php教程》
什么是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来标记文本文件的编码方式的。
在所有内容输出之前
print(chr(0xef).chr(0xbb).chr(0xbf));
几个utf编码的bom头
define ('utf32_big_endian_bom' , chr(0x00) . chr(0x00) . chr(0xfe) . chr(0xff));define ('utf32_little_endian_bom', chr(0xff) . chr(0xfe) . chr(0x00) . chr(0x00));define ('utf16_big_endian_bom' , chr(0xfe) . chr(0xff));define ('utf16_little_endian_bom', chr(0xff) . chr(0xfe));define ('utf8_bom' , chr(0xef) . chr(0xbb) . chr(0xbf));
完整的代码:
header('expires: 0');header('cache-control: private');header('cache-control: must-revalidate, post-check=0, pre-check=0');header('content-description: file transfer');header('content-encoding: utf-8');header('content-type: text/csv; charset=utf-8');header('content-disposition: attachment;filename=customers_export.csv');echo "\xef\xbb\xbf"; // utf-8 bom// print(chr(0xef).chr(0xbb).chr(0xbf));
以上就是php输出csv乱码怎么解决的详细内容。