我通过 PHP 5.2 编程方式将数据导出到 .csv 测试文件中。
例如数据:Numéro 1
(请注意重音符号的e)。
数据是 utf-8
格式(没有前置 BOM)。
当我在 MS Excel 中打开此文件时,它显示为 Numéro 1
。
我能够在文本编辑器(UltraEdit)中打开并正确显示。 UE 报告该字符为 十进制 233
。
我该如何导出文本数据到 .csv 文件中,以便 MS Excel 能够正确呈现,最好不需要强制使用导入向导或非默认向导设置?
我通过 PHP 5.2 编程方式将数据导出到 .csv 测试文件中。
例如数据:Numéro 1
(请注意重音符号的e)。
数据是 utf-8
格式(没有前置 BOM)。
当我在 MS Excel 中打开此文件时,它显示为 Numéro 1
。
我能够在文本编辑器(UltraEdit)中打开并正确显示。 UE 报告该字符为 十进制 233
。
我该如何导出文本数据到 .csv 文件中,以便 MS Excel 能够正确呈现,最好不需要强制使用导入向导或非默认向导设置?

。Ã
和其他类似的 Windows-1252 字符。 添加 UTF8 BOM 可能是您最好和最快的解决方法。
如果您被困在旧版 Excel 上,而且 Excel 是您 CSV 文件的唯一消费者,那么您可以通过导出 UTF16 而不是 UTF8 来解决这个问题。Excel 2000 和 2003 可以正确地打开这些文件。(某些其他文本编辑器可能会有 UTF16 的问题,因此您需要仔细权衡您的选择。)
* 除非您无法这样做,否则至少Excel 2011 for Mac的导入向导实际上并不总是使用所有编码工作,无论您告诉它什么。 </anecdotal-evidence> :)

)。它只有在猜测算法和某些明确允许其使用的文件格式(例如XML)才有所帮助。在UTF-8文件中包含伪BOM的缺点是会破坏它们与ASCII的兼容性(这是UTF-8的一个重要卖点)。很多不考虑编码的文本工具会在遇到意外的前导伪BOM时出现错误。 - bobince /**
* Export an array as downladable Excel CSV
* @param array $header
* @param array $data
* @param string $filename
*/
function toCSV($header, $data, $filename) {
$sep = "\t";
$eol = "\n";
$csv = count($header) ? '"'. implode('"'.$sep.'"', $header).'"'.$eol : '';
foreach($data as $line) {
$csv .= '"'. implode('"'.$sep.'"', $line).'"'.$eol;
}
$encoded_csv = mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
header('Content-Description: File Transfer');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="'.$filename.'.csv"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: '. strlen($encoded_csv));
echo chr(255) . chr(254) . $encoded_csv;
exit;
}
更新:文件名改进和错误修复正确的长度计算。感谢TRiG和@ivanhoe011
text/csv
),但却称其为 Excel (application/vnd.ms-excel
)? - TRiGheader('Content-Length: '. mb_strlen($encoded_csv, 'UTF-16LE'));
吗? - Rich Bradshaw所有Excel版本(包括2003和2007)和文件类型的答案
这里的大多数其他答案只涉及到他们自己的Excel版本,可能对您并没有实际帮助,因为他们的答案可能不适用于您的Excel版本。
例如,添加BOM字符会导致自动列分隔符识别问题,但并非所有Excel版本都存在此问题。
有三个变量决定是否适用于大多数Excel版本:
SAP的某个执着的人尝试了每种组合并报告了结果。最终的结论是:使用UTF16le格式、带BOM字符并使用制表符作为分隔符可在大多数Excel版本中使用。
您不相信我?我也不会相信,但请看这里并哭泣:http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator
sep=,
或者你想使用的其他内容呢?如果你已经添加了BOM,我认为你不会反对在文件中添加其他内容。 - Casey在输出CSV数据之前,先输出UTF-8 BOM。这可以解决Windows中的所有字符问题,但对于Mac无效。
echo "\xEF\xBB\xBF";
这对我有效,因为我需要生成一个仅在 Windows PC 上使用的文件。
在没有任何服务包的情况下,无论是否使用BOM(U+ffef或0xEF, 0xBB, 0xBF),UTF-8在办公室2007中都无法正常工作。 安装sp3可以使UTF-8在0xEF,0xBB,0xBF BOM前缀的情况下正常工作。
使用“utf-16-le”进行编码,以及在分隔符中使用制表符时,UTF-16可以通过python工作, 必须手动编写BOM,然后使用“utf-16-le”而不是“utf-16”,否则每个编码(encode())都会将BOM添加到每一行写出的文本中, 这将出现在第二行和之后的第一列中的垃圾数据。
无法确定UTF-16是否在未安装任何服务包的情况下正常工作,因为现在无法回退。 叹气
这是在Windows上的情况,不知道MAC上的office怎么样。
对于两种工作情形,在直接从浏览器启动下载并且文本导入向导未进行干预的情况下,导入操作效果良好,与您期望的一样。
<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<%
Response.Clear();
Response.ContentType = "text/csv";
Response.Charset = "utf-8";
Response.AddHeader("Content-Disposition", "attachment; filename=excelTest.csv");
Response.Write("\uFEFF");
// csv text here
%>
您可以将html文件保存为xls扩展名,并且重音符号将正常工作(至少在2007年之前的版本中)。
示例:请将此文件另存为test.xls (使用Notepad中的“另存为UTF-8”):
<html>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
<table>
<tr>
<th>id</th>
<th>name</th>
</tr>
<tr>
<td>4</td>
<td>Hélène</td>
</tr>
</table>
</html>
border="1"
添加到表格中,您会得到线条,但只围绕着4个单元格 :) - Benjol我也注意到这个问题在一段时间前已经被“回答”了,但我不理解为什么有人说你不能在Excel中成功打开一个UTF8编码的CSV文件而不使用文本向导。
我的可重复体验:
在记事本中键入Old MacDonald had a farm,ÈÌÉÍØ
,然后按Enter键,然后选择“另存为”(使用UTF-8选项)。
使用Python来展示里面实际上是什么:
>>> open('oldmac.csv', 'rb').read()
'\xef\xbb\xbfOld MacDonald had a farm,\xc3\x88\xc3\x8c\xc3\x89\xc3\x8d\xc3\x98\r\n'
>>> ^Z
很好,记事本已经在文件开头放置了BOM。
现在进入Windows资源管理器,双击文件名或右键使用“打开方式...”,Excel(2003)会如预期地显示出来。
open('oldmac.csv', 'rb').read()
来验证你的输入? - John Machin