php输出中文乱码主因是header()调用顺序错误,必须在任何输出前发送content-type头;需确保文件无bom、无空格、php源码与header及html meta编码统一为utf-8,并注意session_start()、ob_start()、数据库连接等场景的执行顺序。

PHP输出中文前必须先设置Header编码
页面出现中文乱码,90%是因为header()调用顺序错了。PHP要求Content-Type响应头必须在任何实际输出(包括空格、BOM、echo、print)之前发送。一旦有输出,header()就会失败,浏览器按默认编码(通常是ISO-8859-1)解析,中文自然变问号或方块。
常见错误写法:
echo " "; // 这里一个空格就足以阻断header
header('Content-Type: text/html; charset=utf-8');
正确做法是确保header()在最顶部,且文件无BOM、无空行、无意外输出:
- 用编辑器保存为「UTF-8 无BOM」格式(Sublime/VS Code/Notepad++均需手动选)
- PHP文件开头不要有任何字符,包括
<?php前的空格或换行 - 避免在
header()前引入含输出的文件(比如带echo的config.php)
缓存页面时header和ob\_start()顺序不能颠倒
加了ob_start()做页面缓存后,很多人误以为可以晚点设编码——其实不行。ob_start()只是开启缓冲,并不改变输出时机;真正决定编码的是header()是否在第一次echo前执行。
立即学习“PHP免费学习笔记(深入)”;
典型错误顺序:
ob_start();
echo "你好";
header('Content-Type: text/html; charset=utf-8'); // ❌ 已输出,header失效
正确顺序(header优先,再开缓冲,再输出):
header('Content-Type: text/html; charset=utf-8');
ob_start();
echo "你好"; // ✅ 此时才开始实际内容输出
ob_end_flush();
-
header()必须在ob_start()之前或紧随其后,但绝不能在任何echo之后 - 如果用了
session_start(),它也可能隐式输出(尤其session.save_handler=files且权限异常时),要放在header()前并确认无警告 - Apache模块下可配
AddDefaultCharset UTF-8兜底,但Nginx或CLI环境不生效,不能依赖
PHP文件本身编码和HTML meta charset要一致
即使header()设对了,如果PHP源文件存的是GBK,而header()声明UTF-8,PHP会把GBK字节当UTF-8输出,浏览器再按UTF-8解,结果还是乱码。同理,HTML里<meta charset="gbk">鍜











