我想在php中创建一个CSV文件,用UTF-8编码,所有字符都很好地渲染(甚至是重音符号,因为我是法语),除了引号,它们呈现为“'
”。 / p>
任何人都可以帮助我吗?
以下是我的代码示例,在Symfony2
中$response = new Response();
$response->headers->set('Content-Type', 'text/csv');
$response->headers->set('Content-disposition', 'attachment; filename="'.$name.'.csv"');
$response->setContent(utf8_decode($csv));
$response->setStatusCode(200);
非常感谢
答案 0 :(得分:0)
一些指示:
utf8_decode
生成ISO-8859-1内容。因此,您的输出不是UTF-8。
'
在UTF-8,ASCII,Windows-1252和ISO-8859-1中相同
我怀疑'
来自您的CSV来源。
如果您正在构建源代码,请确保使用UTF-8字符。那你就不需要转换了。如果您正在从磁盘读取,请确保您知道原始字符集。除非您知道原始字符集,否则不要转换字符集。
答案 1 :(得分:0)
这是对我有用的解决方案。 我使用的是 Symfony 4.4。
headers
=> 包含您的标题。
lines
=> 包含您的台词。
$response = new StreamedResponse();
$response->headers->set('Content-Type', 'application/force-download');
$response->headers->set('Content-Disposition', $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
'export.csv'
));
$response->setCallback(function () use ($headers, $lines) {
$handle = fopen('php://output', 'w+');
// Mandatory: Use bom + "Content-Type: application/force-download" => to allow to display special characters with excel
fwrite($handle, $bom = chr(hexdec('EF')).chr(hexdec('BB')).chr(hexdec('BF')));
// headers
fputcsv($handle, $headers, ';');
// data
foreach ($lines as $line) {
fputcsv($handle, $line, ';');
}
fclose($handle);
});