You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UTF-8转换时CSV导出仅显示单列问题求助

解决UTF-8编码下CSV导出内容全在单列的问题

我懂你遇到的这个头疼问题——导出的CSV用UTF-8编码时,所有内容都挤在同一列里,但其他编码下却正常。这主要是两个原因导致的:一是UTF-8文件缺少BOM(字节顺序标记),让Excel这类表格软件没法正确识别编码和分隔符;二是你当前的代码在拼接CSV内容时存在格式错误,比如没正确换行、列数不匹配。

下面给你两种修复方案,你可以根据需求选择:

方案一:修复手动拼接的代码(保留原有逻辑)

先解决BOM识别问题,再修正内容拼接的格式:

$link = mysqli_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PWD, MYSQL_DB);
$link->set_charset("utf8");
$sql = "SELECT * FROM weekevents";
$query = mysqli_query($link,$sql);

// 定义表头,注意列数要和后续记录匹配
$col = "col1,col2,col3,col4\n";

foreach ($query as $record){
    // 如果你需要用到cam字段,可以在这里处理后加入列中
    // $cam = explode(';', $record['cam']);
    // 拼接当前记录的所有列,结尾加换行符保证每条记录单独一行
    $col .= $record['weekday'] . ',' . $record['week'] . ',' . $record['col3'] . ',' . $record['col4'] . "\n";
}

$filename = date("m-Y");
$filePath = 'C:/xampp/htdocs/rge/main-rtl/uploads/שיבוץ חודש -'.$filename.'.csv';
$csv_handler = fopen($filePath, 'w');

// 写入UTF-8 BOM头,让表格软件正确识别编码
fwrite($csv_handler, "\xEF\xBB\xBF");
// 写入整理好的CSV内容
fwrite($csv_handler, $col);

fclose($csv_handler);
echo 'Data saved to csvfile.csv';

方案二:使用PHP内置的fputcsv函数(更推荐)

手动拼接CSV很容易踩坑(比如内容里有逗号、引号时会破坏格式),用fputcsv能自动处理这些情况,同时也能配合BOM解决编码问题:

$link = mysqli_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PWD, MYSQL_DB);
$link->set_charset("utf8");
$sql = "SELECT * FROM weekevents";
$query = mysqli_query($link,$sql);

$filename = date("m-Y");
$filePath = 'C:/xampp/htdocs/rge/main-rtl/uploads/שיבוץ חודש -'.$filename.'.csv';
$csv_handler = fopen($filePath, 'w');

// 写入UTF-8 BOM头,确保表格软件正确识别编码
fwrite($csv_handler, "\xEF\xBB\xBF");

// 写入表头列
fputcsv($csv_handler, ['col1', 'col2', 'col3', 'col4']);

foreach ($query as $record){
    // 处理cam字段(按需调整,比如取分割后的第一个值)
    $cam = explode(';', $record['cam']);
    // 组装当前行的列数据,顺序和表头对应
    $row = [
        $record['weekday'],
        $record['week'],
        $cam[0],
        $record['col4']
    ];
    // 自动格式化并写入一行CSV
    fputcsv($csv_handler, $row);
}

fclose($csv_handler);
echo 'Data saved to csvfile.csv';

关键修改点说明:

  1. UTF-8 BOM头:"\xEF\xBB\xBF"这个字节序列会告诉Excel等软件“这是UTF-8编码的文件”,这样它就能正确解析逗号作为列分隔符,不会把所有内容塞到一列里。
  2. 正确的换行符:确保每条记录后面都有换行符,让每条数据单独占一行,避免内容连在一起。
  3. 列数匹配:表头的列数要和每条记录的列数一致,否则会导致格式混乱。
  4. 使用fputcsv:这个函数会自动处理内容中的特殊字符(比如内容里有逗号时会用引号包裹),避免手动拼接出现的格式错误,是处理CSV导出的最佳实践。

内容的提问来源于stack exchange,提问作者dror shalit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:25:39