【问题标题】:PHP encoding Umlauts and Spaces in .csv for Excel用于 Excel 的 .csv 中的 PHP 编码变音符号和空格
【发布时间】:2021-01-18 07:22:11
【问题描述】:

我有一些 json 数据需要以 .csv 文件的形式通过电子邮件发送给我的用户。

对于Hällowörld,以下代码按预期工作,但是,一旦我在其中放置了一个空格Hällo wörld,在 Excel 中打开时,.csv 文件将读取 ÔªøH√§llo w√∂rld(对于 Mac)。

$temp = fopen('php://temp/maxmemory:10485760', 'w');
$rows = json_decode('[["Hällowörld"]]'); // -> Hällowörld
//$rows = json_decode('[["Hällo wörld"]]'); // -> ÔªøH√§llo w√∂rld
foreach($rows as $row) {
  $row = array_map(function($cell) {
    return chr(239).chr(187).chr(191).$cell;
  }, $row);
  fputcsv($temp, $row, ';');
}
rewind($temp);
$csv = stream_get_contents($temp);
fclose($temp);
$csv = base64_encode($csv);
// -> post $csv to my email provider's API

几点说明:

  • 我的代码是 UTF-8 格式
  • 如果我使用 Apple 的数字或 textedit 打开文件,内容会按预期显示。
  • 如果我不使用chr(239).chr(187).chr(191).$cell 进行映射,我会得到H√§llow√∂rld
  • 如果相反,我使用mb_convert_encoding($cell, 'UTF-16LE', 'UTF-8')mb_convert_encoding($cell, 'Windows-1252', 'UTF-8'),正如通常建议的那样,我得到H‰llowˆrld
  • 最后的 base64_encode() 是必需的,因为我的电子邮件提供商需要对附件进行 base_64 编码。

【问题讨论】:

标签: php excel csv encoding special-characters


【解决方案1】:

我找到了解决方案! :) 将上面的 foreach 循环替换为以下内容:

array_unshift($rows, [chr(239).chr(187).chr(191)]);
foreach($rows as $row) {
  fputcsv($f, $row, ',');
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    相关资源
    最近更新 更多