导出的结果文件用 Excel 打开,满意度显示成问号串,二十多列中文表头全废,英文列正常。乍看像缓存或者权限的锅,追下去往往不是。

fprintf($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));
fputcsv($fp, $row);

追下去是这么回事:导出用了 CSV 而且没写 BOM,Excel 按本地 GBK 解码 UTF-8。另一处是 fputcsv 直接写入了未转换的字符串。

「问卷导出乱码」这类改动最怕改一半,回滚脚本先准备好,再动生产。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

具体做法是,改成导出 xlsx,或者 CSV 开头写 UTF-8 BOM;文件名带中文时按 RFC 5987 编码,别直接塞进 header;用 Excel 和 WPS 各打开一次,两种都要看。

验收就看一点,Excel 打开中文表头和数据都正常,另存再导入不出现问号。

作者 9823189