PHP开发中中文乱码问题多发生在页面输出、数据存储与读取、字符串处理等环节,本质是字符编码未统一。常见的编码包括UTF-8、GBK、GB2312等,其中UTF-8是国际通用编码,适配多数场景。

一、页面输出中文乱码处理
页面直接输出中文出现乱码,最常见的原因是服务器返回的内容编码与浏览器解析编码不一致。可以通过设置HTTP响应头指定编码:
<?php
// 设置HTTP响应头,指定内容类型为HTML,编码为UTF-8
header('Content-Type: text/html; charset=utf-8');
echo '这是一段中文内容';
?>
同时需要确保PHP文件本身的编码是UTF-8无BOM格式,多数编辑器可以在保存文件时选择编码格式,避免文件自带BOM头导致输出异常。
二、数据库交互中文乱码处理
连接MySQL数据库时出现中文乱码,需要在建立连接后设置字符集。以mysqli扩展为例:
<?php
$mysqli = new mysqli('127.0.0.1', 'root', 'password', 'test_db');
// 检查连接是否成功
if ($mysqli->connect_error) {
die('连接失败: ' . $mysqli->connect_error);
}
// 设置客户端、连接、结果集的字符集为UTF-8
$mysqli->set_charset('utf8');
// 插入中文数据测试
$sql = "INSERT INTO user (name) VALUES ('张三')";
$mysqli->query($sql);
?>
如果是PDO扩展,可以在初始化时设置字符集:
<?php
try {
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test_db;charset=utf8', 'root', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 插入中文数据
$stmt = $pdo->prepare("INSERT INTO user (name) VALUES (:name)");
$stmt->execute([':name' => '李四']);
} catch (PDOException $e) {
echo '连接失败: ' . $e->getMessage();
}
?>
三、字符串处理函数编码适配
PHP原生的字符串函数如strlen()、substr()默认按字节处理,处理中文会出现截断乱码,需要使用多字节字符串函数:
<?php $str = '中文测试字符串'; // 错误用法:按字节截取,会截断中文 echo substr($str, 0, 3); // 输出乱码 // 正确用法:使用mb_substr按字符截取,指定UTF-8编码 echo mb_substr($str, 0, 3, 'utf-8'); // 输出 中文测 // 获取中文字符串长度 echo mb_strlen($str, 'utf-8'); // 输出 7 ?>
使用这类函数前需要确保PHP已开启mbstring扩展,多数集成环境默认开启,若未开启可以在php.ini中配置extension=mbstring后重启服务。
四、表单提交中文乱码处理
表单提交中文后出现乱码,需要检查表单页面的编码和提交后的处理编码是否统一。表单页面需要设置<meta charset="utf-8">,提交到PHP脚本后,若使用POST方式,还可以通过设置mb_internal_encoding()指定内部编码:
<?php
// 设置内部编码为UTF-8
mb_internal_encoding('utf-8');
// 接收POST提交的中文内容
$username = $_POST['username'] ?? '';
echo '接收到的用户名是:' . $username;
?>
常见问题排查清单
- 检查PHP文件编码是否为UTF-8无BOM格式
- 检查HTTP响应头是否设置了正确的
charset - 检查数据库连接字符集是否设置为UTF-8
- 检查字符串处理函数是否使用了对应的多字节版本
- 检查表单页面和接收页面的编码是否统一