我一直在查看所有答案,但我找不到解决方案。
这是我得到的:
MySQL:
数据库&表格编码=> utf8_unicode_ci
我正在尝试将数组(包含查询中的行)转换为CSV
然而,当我打开csv时,我得到了这个
Prénom
而不是
Prénom
这是我的代码
$allQueryRows = array();
while($row_query = $stmt_select->fetch(PDO::FETCH_ASSOC)){
$row_query = array_map("utf8_encode", $row_query);
array_push($allQueryRows, $row_query);
}
download_send_headers("csv" . date("Y-m-d") . ".csv");
echo array2csv($allQueryRows);
die();
function array2csv(array &$array)
{
if (count($array) == 0) {
return null;
}
ob_start();
$df = fopen("php://output", 'w');
fputcsv($df, array_keys(reset($array)));
foreach ($array as $row) {
fputcsv($df, $row);
}
fclose($df);
return ob_get_clean();
}
function download_send_headers($filename) {
// disable caching
$now = gmdate("D, d M Y H:i:s");
header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
header("Last-Modified: {$now} GMT");
// force download
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
// disposition / encoding on response body
header("Content-Disposition: attachment;filename={$filename}");
header("Content-Transfer-Encoding: binary");
}
答案 0 :(得分:0)
您应该在SET NAMES utf8;
查询之前发送SELECT
MySQL查询,而不是array_mapping
之后的数据。
然后在HTTP标头中发送
Content-Type: text/csv; charset=utf-8;
答案 1 :(得分:0)
首先,当你说,“但是当我打开csv时,我得到了这个”你是什么意思“打开”,即打开什么?
我建议用十六进制查看文件以确切了解文件中的内容。可能是您在(编辑器或其他)中打开它的原因是导致显示的原因进入你的眼球是错误的,或者你的开放计划看到的基础数据可能是错误的。我想你需要先解决这个问题。
(提示:一般来说,这是分裂和征服的旧过程:找到一种方法来测试问题中间的某个地方,看看你系统的哪一半导致问题。最快的结果来自挑选测试点大约在复杂性中间的一半,而不是问题的边缘,即布尔搜索错误。它可能在第一次迭代中找不到问题,但它会帮助缩小范围。)
也许您需要告诉SQL使用哪个,例如$连接 - > set_charset( “UTF8”);
或许你所看到的实际上显示的是与你认为的不同,因为utf8 / utf16显示级别混淆。我一般用utf8设置,所以设置Content-Type:text / plain;字符集= UTF-8; (另外,如果您通过编辑器查看此文件,请确保将其设置为正确的字符空间。)