我需要在UTF16-LE中通过PHP生成csv以支持Excel(在Windows和Mac OS X上)。根据建议here,我使用mb_convert_encoding
并在文件开头添加了BOM,然后是sep=;
,以便在Excel上正常打开。
header('Content-Type: application/csv; charset=UTF-16LE');
header('Content-Disposition: attachment; filename=export.csv');
$output = fopen('php://output', 'w');
fputs($output, mb_convert_encoding("\xEF\xBB\xBF" . "sep=;\n" . implode($labels, ";") . "\n", 'UTF-16LE', 'UTF-8'));
foreach($data as $data_line) {
fputs($output, mb_convert_encoding(implode($data_line, ";") . "\n", 'UTF-16LE', 'UTF-8'));
}
字符编码没问题,但是当我尝试在OpenOffice中打开它时,我得到的是:
无法识别sep=;\n
- 它不应该在第一行。我不认为这是一个BOM问题,因为当我用十六进制编辑器打开它时,这就是我得到的:
BOM似乎是正确的,因为ÿþ
是UTF16-LE BOM。我尝试用\r\n
代替\n
,但没有运气。
答案 0 :(得分:1)
我无法确定这是否是导致问题的原因,但我看到的一个明显问题是您没有将sep=;\n
字符串编码为UTF-16LE。
要解决此问题,请将您的第一条fputs()
行更改为:
$bom = "\xEF\xBB\xBF";
$header = $bom . "sep=;\n" . implode($labels, ";") . "\n";
fputs($output, mb_convert_encoding($header, 'UTF-16LE', 'UTF-8'));
(字符串\xEF\xBB\xBF
是UTF-8编码中的Unicode字节顺序标记;转换为UTF-16时,它将生成正确的BOM。)