PHP输出HTML或JSON时必须五层UTF-8对齐:PHP文件无BOM、数据库连接设utf8mb4、header声明charset、HTML中、JS用JSON接口而非拼接字符串。

PHP 输出 HTML 页面时默认不声明字符编码,浏览器靠自动探测或历史缓存猜,一猜就乱;JavaScript 读取 PHP 返回的 JSON 或 DOM 文本时,若 PHP 没设好编码,UTF-8 字符会变成 或错位中文——根源不是 JS 写错了,是 PHP 没把编码“说清楚”。
PHP 输出 HTML 前必须显式声明 Content-Type 和
只写 不够,浏览器可能在解析到它之前已按错误编码开始渲染;只设 header("Content-Type: text/html; charset=utf-8") 也不保险,某些旧版 IE 会忽略 HTTP 头而依赖 meta。二者得一起上:
- PHP 脚本开头加:
header("Content-Type: text/html; charset=utf-8"); - HTML 的
里紧贴开头放:(不要用http-equiv写法) - 确保 PHP 文件本身是 UTF-8 无 BOM 编码保存(用 VS Code、Notepad++ 等确认,BOM 会导致 header 已发送错误)
PHP 输出 JSON 给 JavaScript 时,json_encode() 必须配合 UTF-8 输入
json_encode() 不会帮你转编码,它只认输入字符串是否为合法 UTF-8。如果从数据库、文件或用户提交拿到的是 GBK 或 ISO-8859-1 字符串,直接 json_encode() 就会输出乱码或返回 false:
- 查数据库前先设连接编码:MySQLi 用
$mysqli->set_charset("utf8mb4"),PDO 用PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4" - 读文件时用
file_get_contents()后,若源文件非 UTF-8,用mb_convert_encoding($str, "UTF-8", "GBK")转(别用iconv(),它对非法字节易报错) - 调用
json_encode()前,用mb_check_encoding($data, "UTF-8")验证,避免静默失败
AJAX 请求 PHP 接口时,JS 端要明确告诉浏览器响应体是 UTF-8
即使 PHP 正确设置了 Content-Type: application/json; charset=utf-8,老版本 jQuery 或原生 XMLHttpRequest 仍可能误判编码。稳妥做法是:
立即学习“PHP免费学习笔记(深入)”;
- jQuery AJAX 中加:
dataType: "json"(自动处理 UTF-8 解码),并确保 PHP header 已设对 - Fetch API 中不用额外操作,但务必让 PHP 返回头含
charset=utf-8,否则response.text()可能错解 - 避免用
innerHTML直接插入未转义的 PHP 输出文本,应走textContent或JSON.parse()后渲染
PHP 和 JS 共享数据时,绕过编码最稳的方式是只传 ASCII 安全子集
比如时间戳、ID、状态码这类纯英文/数字字段,根本不会乱;真要传中文,优先走 JSON 接口而非拼 HTML 字符串。常见翻车点:
- 用
echo ""——$name里有单引号或换行就崩,且没编码控制 - 正确做法:PHP 里
echo "" -
JSON_UNESCAPED_UNICODE很关键,否则中文变\u4f60\u597d,虽能用但可读性差、调试难
真正卡住人的往往不是某个函数不会用,而是 PHP 文件编码、数据库连接编码、HTTP 响应头、HTML meta、JS 解析方式这五层里有一层漏了 UTF-8 声明——它们必须全部对齐,缺一不可。










