【问题标题】:PHP fputcsv with UTF-8 ProblemPHP fputcsv 与 UTF-8 问题
【发布时间】:2011-06-16 23:43:58
【问题描述】:

我试图让我的客户在 Excel 中查看一些 MySQL 数据。我用过 PHP 的 fputcsv() 函数,比如:

public function generate() {
   setlocale(LC_ALL, 'ko_KR.UTF8');

   $this->filename = date("YmdHis");
   $create = $this->directory."Report".$this->filename.".csv";

   $f = fopen("$create","w") or die("can't open file");
   fwrite($f, "\xEF\xBB\xBF");

   $i = 1;
   $length = count($this->inputarray[0]);

   fwrite($f, $this->headers."\n");

   // print column titles
   foreach($this->inputarray[0] as $key=>$value) {
    $delimiter = ($i == $length) ? "\n\n" : ",";
    fwrite($f, $key.$delimiter);
    $i++;
   }

   // print actual rows
   foreach($this->inputarray as $row) {
    fputcsv($f, $row);
   }
   fclose($f);
  } 

我的客户是韩国人,并且 MySQL 数据库的很大一部分包含 utf8_unicode_ci 中的值。通过使用上述函数,我成功生成了一个包含正确编码数据的 CSV 文件,该文件可以在我的机器上的 Excel 中正常打开(英文 Win7),但是当我在客户端计算机上的 Excel 中打开文件(韩文 Win7)时,字符又被打破了。我尝试将标题 (\xEF\xBB\xBF) 取出,并注释掉 setlocale,但无济于事。

你能帮我解决这个问题吗?

【问题讨论】:

  • 你可以尝试在顶部添加mb_internal_encoding("UTF-8"); 并告诉我会发生什么吗???
  • 查看 BOM(字节顺序掩码)。他们使用的是哪个版本的 Excel,2003 年、2007 年等?

标签: php mysql utf-8 export-to-excel fputcsv


【解决方案1】:

尝试在每个 fwrite 调用中使用 utf8_encode 包装文本。

然后使用这里的建议:http://www.php.net/manual/en/function.fwrite.php#69566

【讨论】:

【解决方案2】:

尝试将数据编码为 UTF-16LE,并确保文件具有适当的 BOM。

或者,向您的客户发送 Excel 文件而不是 CSV,那么编码应该不是问题

【讨论】:

    【解决方案3】:

    如果,如您所说,您的 CSV 文件具有“正确编码的数据” - 即它包含有效的 UTF-8 字节流,并假设文件的字节流在您的客户端站点是相同的(例如,在传输过程中没有因文件传输问题而损坏),那么这听起来像是客户端机器上的 Excel 无法正确解释 UTF-8 的问题。这可能是因为它不受支持,或者在导入时需要选择某些选项来指示编码。因此,您可以尝试使用不同的编码(使用mb_convert_encodingiconv)生成文件。

    如果您让客户导出包含韩语字符的 CSV,那么您将能够查看该文件并确定正在生成的编码。然后,您应该尝试使用该编码。

    【讨论】:

      猜你喜欢
      • 2011-11-30
      • 2011-06-05
      • 2011-04-02
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 2017-03-07
      • 2012-04-11
      • 2014-04-26
      相关资源
      最近更新 更多