【问题标题】:PHP export CSV when data having UTF8 charcters当数据具有 UTF 8 个字符时 PHP 导出 CSV
【发布时间】:2013-07-11 11:54:32
【问题描述】:

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

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

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

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

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

请帮忙。谢谢。

【问题讨论】:

  • @Mark Ba​​ker 是的,我在一些帖子中读过它,但我不知道如何使用它。你能帮忙吗?
  • 在将任何数据输出到文件之前,将“\xEF\xBB\xBF”写入文件...在 BOM 和在数据之前(或适当的字符,如果你不使用逗号),因为 MS Excel 的默认分隔符是特定于语言环境的
  • “类似问题”有示例代码。将假 BOM 放入 UTF-8 文件几乎总是错误的事情,但不幸的是,让 Excel 读取 UTF-8 CSV 是必要的。

标签: php excel csv unicode


【解决方案1】:

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

这就是转换的原因:

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

之前我得到的是乱码,现在导出了正确的数据。

【讨论】:

  • 请注意,生成的 csv 将是 UTF8 大小的两倍。只需付出很小的代价即可轻松解决困扰许多人已久的棘手问题!
  • 我想在这里添加的一个小发现是,如果您使用的是 tsv 而不是 csv,则使用双引号添加 \t "" 而不是单引号 ''
  • 谢谢!这个技巧拯救了我的一天。
  • 对我来说不幸的是,大约 75% 的结果文本是中文字符,剩下的 25% 显示正确。这意味着什么?
【解决方案2】:

我遇到了同样的问题,我通过结合两件事来解决:

首先,您必须将表排序规则更改为 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;

【讨论】:

  • 我的朋友没用。在 elx/csv 文件中显示乱码。我已经把所有的代码放在这里了。请检查 - oxyjone.blogspot.in/2013/07/generating-excel-having-utf-8.html
  • 我认为这是我的错! mysql_query("设置名称 utf8");应该在主要查询之前! :)
  • 提示:"\xEF\xBB\xBF" BOM 在使用 nginx 时会出现错误,您不能使用它强制下载。浪费在这上面的时间。
  • 这一行解决问题 print "\xEF\xBB\xBF"; // UTF-8 物料清单
  • @Husseinmahyoub 我也一样
【解决方案3】:

我有一个 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)替换;,这样对我来说效果很好!

【讨论】:

    【解决方案4】:

    试试下面的代码;

    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();
    

    【讨论】:

    • 请参考http://stackoverflow.com/questions/4348802/how-can-i-output-a-utf-8-csv-in-php-that-excel-will-read-properly?rq=1
    猜你喜欢
    • 2012-05-08
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2016-10-09
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多