【发布时间】: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 编码。
【问题讨论】:
-
chr(239).chr(187).chr(191)(在macintosh encoding 中读取Ôªø)是UTF-8文件签名(byte order mark)。试试mb_convert_encoding($cell, 'macintosh', 'UTF-8') -
创建一个空文件
-
谢谢,但
return iconv('macintosh', 'UTF-8', $cell);返回H‚àö¬ßllo w‚àö‚àÇrld -
它看起来像双 mojibake...
标签: php excel csv encoding special-characters