PHP导出CSV中文乱码的解决方法是在文件开头写入UTF-8 BOM头(\xEF\xBB\xBF),配合设置Content-Type、Content-Disposition和Cache-Control响应头,并确保fputcsv()输入为纯字符串数组。
PHP导出CSV时中文乱码怎么解决
直接用 fputcsv() 写入中文会变成乱码,本质是CSV没有编码声明,Excel默认按ANSI(如GBK)打开UTF-8内容。最简单有效的办法是在文件开头写入UTF-8 BOM头。
- 用
fopen()打开文件后,先写入\xEF\xBB\xBF(即BOM) - 再调用
fputcsv()写入表头和数据行 - 避免用
mb_convert_encoding()转成GBK——不同系统行为不一致,且破坏原始编码一致性
如何从$_POST或数据库动态生成CSV文件
导出的数据源可以是提交的表单($_POST),也可以是查库结果(mysqli_fetch_assoc() 或 PDO::fetch())。关键是统一转为二维数组,每项代表一行。
- 若导出当前表单:把
$_POST包裹成数组,例如[$\_POST];注意过滤掉非业务字段(如submit、token) - 若导出数据库:用
while ($row = $result->fetch_assoc()) { $data[] = $row; }收集 - 字段顺序靠数组键名决定,建议显式定义表头数组:
$headers = ['姓名', '邮箱', '提交时间'];,再用array_keys($row)对齐
浏览器下载CSV而不是直接显示,需要哪些HTTP头
缺关键响应头会导致CSV在浏览器里直接渲染为乱码文本,或被当成HTML解析。必须设置三类头: