【发布时间】:2017-03-19 17:49:25
【问题描述】:
我在导出带有中文字符的 UTF-8 CSV 时遇到了几天,这些字符在 Windows Excel 上显示乱码。我正在使用 PHP,并且已经添加了 BOM 字节标记并尝试了编码,但一点运气都没有。
它们可以在 Notepad++、Google 电子表格甚至 Mac Numbers 上正常打开。但不是在客户要求的 Excel 上。使用 Notepad++ 打开时,编码显示为 UTF-8。如果我手动将其更改为 UTF-8 并保存,则该文件在 Excel 上可以正常打开。
似乎 BOM 字节标记没有保存在输出中,因为 Notepad++ 总是将其检测为没有 BOM 的 UTF-8。
此外,CSV 不会保存在服务器上。数据从数据库中检索出来,然后直接导出。
这是我的代码:
// Setup headers
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Description: File Transfer');
header("Content-type: text/csv");
header("Content-disposition: filename=".$filename.".csv");
header("Pragma: no-cache");
// First Method
$fp = fopen('php://output', 'w');
// Add BOM to fix UTF-8 in Excel, but doesn't work
fputs($fp, chr(0xEF) . chr(0xBB) . chr(0xBF) );
if ($fp) {
fputcsv($fp, array("Header"), ",");
fputcsv($fp, array($string_with_chinese_chars), ",");
}
fclose($fp);
exit();
// Second Method
$csv = "";
$sep = ",";
$newline = "\n"; // Also tried with PHP_EOL
$csv .= "Header";
$csv .= $newline;
$csv .= $string_with_chinese_chars;
$csv .= $newline;
// Tried all the below ways but doesn't work.
// Method 2.1
print chr(255) . chr(254) . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
// Method 2.2
print chr(239) . chr(187) . chr(191) . $csv;
// Method 2.3
print chr(0xEF).chr(0xBB).chr(0xBF);
print $newline;
print $csv;
【问题讨论】:
-
你能在Notepad++中保存之前和之后在十六进制编辑器中打开文件,看看有什么区别吗?如果它足够短,甚至可以将文件的十六进制转储添加到您的问题中?
-
好的,我试试再更新。
-
更新:下载的文件HEX以0A EF BB BF开头。而使用 Notepad++ 保存后的文件以 EF BB BF 0A EF BB BF 开头。 0A 看起来是一条新线。不知何故,这似乎是在文件的开头添加的,即使代码中没有任何部分这样做。这是一个共享托管服务器,我无权访问 php.ini。
标签: php excel csv encoding utf-8