带有BOM的PHP导出CSV UTF-8不起作用

我一直在使用中文字符导出UTF-8 CSV,这些字符在Windows Excel上显示乱码文本。 我正在使用PHP,并已经添加了BOM字节标记,并尝试编码,但没有运气。

他们可以在Notepad ++,Google Spreadsheet甚至Mac数字上打开。 但不是客户要求的Excel。 用Notepad ++打开时,编码显示为UTF-8。 如果我手动将其更改为UTF-8并保存,Excel文件将打开罚款。

似乎BOM字节标记没有被保存在输出中,因为记事本++始终将其检测为没有BOM的UTF-8。

另外,CSV不保存在服务器上。 数据从DB中检索,然后直接导出。

这是我的代码:

// 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; 

根据上面的注释,看起来您的脚本意外地在UTF-8 BOM之前打印出一个换行符(hex0A ),导致Excel无法将输出识别为UTF-8。

由于您使用的是PHP,请确保脚本中的<?php标记之前没有空行,或者可能包含任何其他PHP文件。 还要确保没有任何文件在closures?>标记之后有空格,如果有的话。

在实践中,这可能是相当难的,因为许多文本编辑坚持总是在最后一行的末尾添加一个换行符。 因此,最安全和最简单的解决scheme是简单地从PHP文件中删除?>标记 ,除非打算打印出来后的任何内容。 PHP不需要使用?> ,并且在不需要混合PHP和文字模板HTML(或其他文本)的文件中使用它就是要求这样的错误。

我通常这样做:

 header('Content-Type: application/csv'); header('Content-Disposition: attachment; filename="filename.csv"'); header('Cache-Control: max-age=0'); // BOM header UTF-8 echo "\xEF\xBB\xBF"; $fh = @fopen('php://output', 'w'); ... 

我使用";" 作为最擅长的分隔符不会自动生成","