PHP输出中文需同步设置header('Content-Type: text/html; charset=utf-8')、源文件存为UTF-8无BOM,并配置数据库连接使用utf8mb4编码,三者缺一不可。

PHP输出中文前必须设置Content-Type响应头
浏览器看到PHP返回的中文变问号或方块,根本原因不是PHP没读对文件编码,而是它默认按ISO-8859-1发内容,浏览器就用这个编码去解——结果当然错。关键动作是让PHP在输出任何内容前,明确告诉浏览器:“这是UTF-8”。
-
header('Content-Type: text/html; charset=utf-8')必须放在所有echo、print、HTML输出之前,哪怕只多一个空格或BOM也会报“headers already sent”错误 - 如果用了
require或include,要确认被引入的文件开头没有空行、BOM或echo - CLI模式下这个
header()无效,只影响HTTP响应;命令行脚本乱码得查终端编码和php.ini里的default_charset
PHP源文件本身编码必须是UTF-8无BOM
就算header()设对了,源文件存成GBK或带BOM的UTF-8,PHP解析时就会把BOM当普通字符输出,导致headers已发送错误,或者页面顶部冒出乱码字符。
- 用VS Code、Sublime Text等编辑器打开PHP文件,右下角看编码显示,选“Save with Encoding → UTF-8”(不是UTF-8 with BOM)
- Linux/macOS下可用
file -i yourfile.php检查实际编码;Windows记事本保存的UTF-8默认带BOM,务必换编辑器 - PHP 7.4+对BOM容忍度略高,但旧版本(尤其5.6)遇到BOM几乎必报错
数据库查询中文乱码不能只靠header
网页显示正常但从MySQL读出来的中文还是乱码?说明问题出在连接层,不是输出层。header只管“怎么发”,不管“从哪读”。
- 使用
mysqli时,在new mysqli()后立刻执行$mysqli->set_charset('utf8mb4')(注意是utf8mb4,不是utf8) - 用PDO时,在DSN里加
;charset=utf8mb4,例如mysql:host=localhost;dbname=test;charset=utf8mb4,同时确保PDO::MYSQL_ATTR_INIT_COMMAND没覆盖它 - MySQL服务端配置
character_set_server=utf8mb4和库/表的COLLATE也要匹配,否则SET NAMES utf8mb4只是临时补丁
$_POST和$_GET中文需要额外转义处理
表单提交中文后$_POST['name']变成乱码,通常是因为浏览器按页面声明的UTF-8编码发送数据,但PHP没按同样规则解析——尤其老版本PHP或某些SAPI(如CGI)下容易出问题。
- 确保HTML中
<meta charset="utf-8">存在且位置靠前(最好在<title></title>前) - PHP 5.6+默认
default_charset = "UTF-8",但如果被ini_set('default_charset', 'GBK')覆盖,htmlspecialchars()等函数会按GBK转义,导致输出异常 - 极端情况下可手动用
mb_convert_encoding($_POST['name'], 'UTF-8', 'auto')兜底,但应优先修复源头(表单编码 + PHP配置)
最常被忽略的是:header设置和文件编码必须同步生效,缺一不可;而数据库连接编码是独立一层,改了header对它完全没用。三者任一掉链子,中文就断在某个环节。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











