当具有UTF8字符的数据时,PHP导出CSV

时间:2013-07-11 11:54:32

标签: php excel csv unicode

在MySQL中,我将数据字段类型设置为utf8_bin,我将数据存储在Unicode中。文本正在网页中正确显示。

我想生成excel文件,将数据从我的表导出到它。 .xls.cvs中的输出为 - '????'。

我在这里查看了其他答案,它被称为使用标题:

header("content-type:application/csv;charset=UTF-8");

similar question。但它不起作用。使用标题后,在csv中输出是 - सà¥,रà¥à¤¯à¤¾。

请帮忙。谢谢。

5 个答案:

答案 0 :(得分:18)

这篇文章解决了我的问题:https://stackoverflow.com/a/4762708/2349494

这就是转换的原因:

print chr(255) . chr(254) . mb_convert_encoding($csv_output, 'UTF-16LE', 'UTF-8');

早些时候,我正在获取垃圾字符,现在正确导出数据。

答案 1 :(得分:11)

我遇到了同样的问题,我通过组合两件事来做到这一点:

首先,您必须将表格排序更改为UTF8,例如:“utf8_general_ci”(或只是确保这一点),然后在MySQL查询后添加此代码:

mysql_query("SET NAMES utf8");

$result = mysql_query("SHOW COLUMNS FROM table WHERE Field NOT IN ('user_id', 'password')");
mysql_query("SET NAMES utf8");

然后,将其用作标题(根据您的需要进行调整):

header('Content-Description: File Transfer');
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header("Content-disposition: filename=".$filename.".csv");
header('Content-Transfer-Encoding: binary');
header('Pragma: public');
print "\xEF\xBB\xBF"; // UTF-8 BOM
print $csv_output;
exit;

答案 2 :(得分:5)

我有一个Sajal响应的变种,并在php.net上找到它:http://www.php.net/manual/en/function.iconv.php#104287

在csv内容的开头回声:

chr(255).chr(254).iconv("UTF-8", "UTF-16LE//IGNORE", $data)

我更喜欢使用iconv(),但它似乎与mb_convert_encoding()相同。 不要忘记用标签;替换\t,这对我来说很合适!

答案 3 :(得分:0)

尝试以下代码;

ob_end_clean();
$_filename = date('Y_m_d_H_i').".csv";

header("Cache-Control: public"); 
header("Content-Type: application/octet-stream");
header("Content-Type: text/csv; charset=utf-8");
header("Content-Disposition: attachment; filename=$_filename");
// Read the file from disk
readfile($filename);
exit();

答案 4 :(得分:0)

将其导出为XLS(xml格式),支持unicode,只需测试并正常工作

https://code.google.com/p/php-excel/