php乱码需五处统一为utf8mb4:文件utf-8无bom、header与meta charset一致且前置、mysql连接用utf8mb4、字符串操作用mb_*函数、框架入口及配置文件无bom。

PHP乱码不是单一环节出错,而是文件编码、HTTP响应头、HTML声明、数据库连接、表结构这五处任一不匹配就会触发。必须全部对齐 UTF-8(更准确说是 utf8mb4),缺一不可。
PHP 文件保存为 UTF-8 无 BOM
BOM 是隐藏的三个字节 \xEF\xBB\xBF,它会卡在 header() 前面,直接导致 “headers already sent” 错误,连带 JSON 输出也崩。VS Code 右下角点编码名 → “Save with Encoding” → 选 UTF-8 并**取消勾选 “Include BOM”**;Notepad++ 要选“转为 UTF-8 编码”而非“UTF-8-BOM”。Linux 下可批量清除:sed -i '1s/^\xEF\xBB\xBF//' *.php。
header() 和 meta charset 必须同时存在且一致
只写 header('Content-Type: text/html; charset=utf-8') 不够:CDN 可能剥离 header,某些浏览器(如旧版 Firefox)优先读 <meta charset="UTF-8">。两者必须都写,且值完全一致(大小写不敏感但建议全小写)。<meta> 必须放在 最开头,不能在 <title></title> 或 CSS 引用之后。验证方法:curl -I http://yoursite.com/test.php 看响应头是否含 charset=utf-8。
mysqli 或 PDO 连接后必须显式设 utf8mb4
MySQL 的 utf8 是假 UTF-8,最多存 3 字节字符,emoji 和很多生僻汉字直接变问号。必须用 utf8mb4。mysqli 连接后立刻执行:mysqli_set_charset($conn, 'utf8mb4');PDO 则在 DSN 中加 ;charset=utf8mb4,例如:mysql:host=localhost;dbname=test;charset=utf8mb4。别信 SET NAMES utf8 —— 它调用的是 MySQL 的残缺 utf8,不是 utf8mb4。
中文字符串处理必须用 mb_* 函数
strlen()、substr() 这类函数按字节算,遇到 UTF-8 中文会截断字节流,输出乱码或问号。所有涉及长度、截取、查找的操作,必须换为 mb_strlen()、mb_substr()、mb_stripos()。前提是 php.ini 中已启用 extension=mbstring,且最好设 mb_internal_encoding('UTF-8') 显式声明内部编码,避免依赖配置默认值。
最容易被忽略的是:框架入口文件(如 Laravel 的 public/index.php)可能被修改过,BOM 或空格藏在 require 语句前面;还有 include 的公共配置文件,哪怕一个 .php 里有 BOM,整个链路就失效。逐个检查比猜更省时间。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











