2

我需要通过 UTF16-LE 中的 PHP 生成 csv 以支持 Excel(在 Windows 和 Mac OS X 上)。正如这里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 中打开它时,我得到的是:

开放式办公室 UTF16-LE

sep=;\n无法识别 - 它不应该在第一行。我认为这不是 BOM 问题,因为当我用十六进制编辑器打开它时,我得到的是:

UTF16-LE BOM

BOM 似乎是正确的,因为它ÿþ是 UTF16-LE BOM。我尝试用 with\r\n代替\nafter sep,但没有运气。

4

1 回答 1

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。)

于 2015-10-21T17:41:10.717 回答