PHP 在 .csv 中为 Excel 编码变音符号和空格
PHP encoding Umlauts and Spaces in .csv for Excel
我有一些 json 数据需要以 .csv 文件的形式通过电子邮件发送给我的用户。
下面的代码在 Hällowörld
中按预期工作,但是,一旦我将 space 放在那里,Hällo wörld
,.csv 文件在打开时读取 ÔªøH√§llo w√∂rld
在 Excel(对于 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 的 numbers 或 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-encoded.
我找到了解决办法! :) 将上面的 foreach
循环替换为以下内容:
array_unshift($rows, [chr(239).chr(187).chr(191)]);
foreach($rows as $row) {
fputcsv($f, $row, ',');
}
我有一些 json 数据需要以 .csv 文件的形式通过电子邮件发送给我的用户。
下面的代码在 Hällowörld
中按预期工作,但是,一旦我将 space 放在那里,Hällo wörld
,.csv 文件在打开时读取 ÔªøH√§llo w√∂rld
在 Excel(对于 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 的 numbers 或 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-encoded.
我找到了解决办法! :) 将上面的 foreach
循环替换为以下内容:
array_unshift($rows, [chr(239).chr(187).chr(191)]);
foreach($rows as $row) {
fputcsv($f, $row, ',');
}