PHP正确处理Unicode需四层统一UTF-8:1.PHP文件存为UTF-8无BOM;2.php.ini设default_charset="UTF-8";3.服务器响应头加AddDefaultCharset UTF-8或charset utf-8;4.数据库用utf8mb4并配置连接与表结构。

1. PHP 源文件必须是 UTF-8 无 BOM
这是起点。如果文件本身存成 GBK 或带 BOM 的 UTF-8,PHP 解析器会读错字节,后续所有 header 或函数设置都无效。
- 用 VS Code / Notepad++ / Sublime Text 打开 .php 文件,右下角确认显示 “UTF-8” 且注明 “无 BOM”
- 如有 BOM,选择「另存为 → UTF-8 无 BOM」
- 确保
<?php前没有任何空格、换行或不可见字符
2. 修改 php.ini 的 default_charset
这是 PHP 层最基础的字符集控制,影响自动发送的 Content-Type 头、json_encode()、htmlspecialchars() 等函数行为。
- 运行
php --ini或查看phpinfo()找到实际生效的 php.ini 路径 - 搜索
default_charset,取消注释并设为:default_charset = "UTF-8"(注意:必须带英文双引号,大小写严格为 UTF-8) - 改完后重启 Apache 或 PHP-FPM
3. Web 服务器响应头保持一致
Apache 或 Nginx 要避免覆盖 PHP 的 charset 声明,尤其不能全局强制非 UTF-8。
-
Apache:在虚拟主机配置(
<VirtualHost>)或网站根目录.htaccess中添加:AddDefaultCharset UTF-8
不要写在httpd.conf全局顶层,否则会影响 CSS/JS 等静态资源 -
Nginx:在 server 或 location 块中加:
charset utf-8; - 验证方式:浏览器开发者工具 → Network → 查看 PHP 请求的 Response Headers,确认
Content-Type: text/html; charset=UTF-8唯一存在
4. 数据库连接与表结构同步 utf8mb4
仅 PHP 层设对不够,数据库端也必须匹配,否则存入/读出仍乱码。特别注意:MySQL 推荐用 utf8mb4(不是旧版 utf8),才能完整支持 emoji 和生僻汉字。
立即学习“PHP免费学习笔记(深入)”;
-
MySQL 配置:修改
my.ini或my.cnf,在[mysqld]下添加:character-set-server = utf8mb4collation-server = utf8mb4_0900_ai_ci
并在[client]和[mysql]段加:default-character-set = utf8mb4
重启 MySQL 后执行SHOW VARIABLES LIKE 'character%';,确认 client/connection/results/server 四项全为utf8mb4 -
PHP 连接时指定:
mysqli:调用mysqli_set_charset($conn, 'utf8mb4');
PDO:DSN 中加;charset=utf8mb4,例如:$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", $u, $p); -
已有表转换:
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;



















