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解析。必须设置三类头:
Shop7z网上购物系统支持电脑版+手机版+支付宝及微信支付,支持QQ和微信一键登陆,系统集众家之所长,大气超美观页面+手机版+商品组合套餐+限时抢购秒杀+图片批量上传+淘宝数据包导入+弹出式分类菜单+不同规格不同价格+新订单邮件通知+销售报表打印与Excel输出+物流跟踪打印查询+会员积分及优惠券+邮件群发+图片在线管理+销售统计报表+五种价格体系+礼品礼券+微信公众号支付+扫码支付等等等。
-
Content-Type: text/csv; charset=utf-8—— 告诉浏览器这是CSV -
Content-Disposition: attachment; filename="form_export_".date('Ymd_His').".csv"—— 触发下载,且带时间戳防重名 -
Cache-Control: no-cache—— 防止代理或浏览器缓存旧文件 - 务必在
ob_end_clean()后、输出CSV内容前发送这些头,否则报“headers already sent”
用fputcsv()导出时字段含逗号、换行符怎么办
fputcsv() 本身已处理特殊字符转义(自动加双引号、转义内部双引号),但前提是传入的是纯字符串数组,不能提前拼接或转义。
立即学习“PHP免费学习笔记(深入)”;
- 不要手动给字段加引号或反斜杠,
fputcsv()会自己做 - 确保数据是字符串类型:对数字/布尔值用
(string)$val转换,否则可能触发警告或截断 - 含换行符(
\n)的字段会被正确包裹进双引号,Excel能正常识别——前提是没用nl2br()等预处理污染原始值 - 如果字段来自用户输入,仍需先
trim()和str_replace("\r", '', $val),避免Windows回车干扰格式
echo、var_dump 或空格输出。










