PHP乱码根源在于文件保存编码、HTTP响应头、HTML meta声明三者不一致;必须统一为UTF-8无BOM,且header('Content-Type: text/html; charset=utf-8')需在任何输出前调用,并配合兜底。

PHP 文件本身不自动声明编码,乱码根源往往在三个地方:文件保存编码、HTTP 响应头、HTML 页面 meta 声明——三者不一致就必然乱码。
PHP 文件保存编码必须是 UTF-8 无 BOM
很多编辑器(如 Windows 记事本、旧版 Notepad++)默认保存为 ANSI 或 UTF-8 with BOM,BOM 会提前输出三个不可见字节(\xEF\xBB\xBF),导致 header() 报错或页面头部空白、JSON 解析失败。
- 用 VS Code / Sublime Text / PHPStorm 打开 PHP 文件 → 右下角点编码名 → 选
UTF-8(不是UTF-8 with BOM)→ 点“重新以编码保存” - 检查是否含 BOM:Linux/macOS 下运行
head -c 3 yourfile.php | xxd,若输出ef bb bf就有 BOM,需清除 - PHP 代码开头不要空行、空格、UTF-8 BOM,否则
session_start()和header()会直接报Cannot modify header information
PHP 输出前必须用 header() 声明 Content-Type
浏览器不看文件后缀,只信 HTTP 响应头里的 Content-Type。没声明或声明错误(比如写成 gbk),哪怕文件是 UTF-8 也会按默认编码(通常是 ISO-8859-1)解析,中文全变 。
- 在任何
echo、print、HTML 内容输出前,加这行:header('Content-Type: text/html; charset=utf-8'); - 如果用了
session_start(),它必须在header()之前;但header()必须在所有 HTML 输出之前 - 框架项目(如 Laravel、ThinkPHP)通常已内置设置,不必手动加;纯 PHP 脚本务必自己加
HTML 页面里还得补 meta charset 声明
这是给离线打开或 HTTP 头丢失时的兜底方案。仅靠 header() 不够——比如用 file:// 协议双击打开 PHP 文件(没走 Web 服务器),HTTP 头完全不存在,全靠这个 meta。
立即学习“PHP免费学习笔记(深入)”;
- 在 HTML 的
里第一行加:(注意不是http-equiv那种老写法) - 不要写成
,HTML5 只认charset属性 - 数据库查询结果、表单提交内容乱码?那属于 MySQL 连接层问题,和这里无关,别混在一起调
最容易被忽略的是:PHP 文件保存编码 + header() + 这三者必须严格统一为 utf-8。少一个,或者其中一个是 gb2312,乱码就会找上门——而且往往只在某些浏览器或某些操作路径下才暴露。











