带有BOM的UTF16-LE无法识别csv文件中的sep

时间:2015-10-21 14:26:31

标签: php csv byte-order-mark utf-16le

我需要在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中打开它时,我得到的是:

Open Office UTF16-LE

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

UTF16-LE BOM

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

1 个答案:

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