Skip to content

18.4 乱码问题

问题描述

在 PHP 开发中,乱码问题是一个常见的问题。当页面显示的文字出现乱码时,会影响用户体验,甚至导致功能无法正常使用。

常见原因

1. 字符编码设置不一致

字符编码设置不一致是导致乱码的最常见原因,包括:

  • HTML 页面的编码设置与 PHP 脚本的编码设置不一致
  • 数据库的编码设置与 PHP 脚本的编码设置不一致
  • 文件本身的编码格式与 PHP 脚本的编码设置不一致

示例

html
<!-- HTML 页面使用 UTF-8 编码 -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>测试页面</title>
</head>
<body>
    <?php
    // PHP 脚本输出 GB2312 编码的内容
    echo '中文测试'; // 这里可能会出现乱码
    ?>
</body>
</html>

2. 数据库编码设置错误

数据库的编码设置错误会导致从数据库读取的数据出现乱码。

示例

php
<?php
// 连接数据库时没有设置编码
$conn = mysqli_connect('localhost', 'root', '', 'myDB');

// 查询数据
$result = mysqli_query($conn, 'SELECT * FROM users');
$row = mysqli_fetch_assoc($result);
echo $row['name']; // 这里可能会出现乱码
?>

3. 文件编码格式错误

PHP 文件本身的编码格式错误会导致脚本执行时出现乱码。

4. HTTP 头信息编码设置错误

HTTP 头信息的编码设置错误会导致浏览器解析页面时出现乱码。

排查方法

1. 检查 HTML 页面编码

确保 HTML 页面的编码设置正确:

html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>测试页面</title>
</head>
<body>
    <!-- 页面内容 -->
</body>
</html>

2. 检查 PHP 脚本编码

确保 PHP 脚本的编码设置正确:

php
<?php
// 设置 PHP 脚本的编码为 UTF-8
header('Content-Type: text/html; charset=UTF-8');

// 输出内容
echo '中文测试';
?>

3. 检查数据库编码

确保数据库的编码设置正确:

php
<?php
// 连接数据库
$conn = mysqli_connect('localhost', 'root', '', 'myDB');

// 设置数据库编码为 UTF-8
mysqli_set_charset($conn, 'utf8');

// 查询数据
$result = mysqli_query($conn, 'SELECT * FROM users');
$row = mysqli_fetch_assoc($result);
echo $row['name'];
?>

4. 检查文件编码格式

确保 PHP 文件的编码格式为 UTF-8:

  • 在 VS Code 中,可以通过右下角查看和修改文件编码格式
  • 在 Sublime Text 中,可以通过 "File" > "Save with Encoding" 选择编码格式
  • 在 Notepad++ 中,可以通过 "编码" 菜单选择编码格式

5. 检查 HTTP 头信息

确保 HTTP 头信息的编码设置正确:

php
<?php
// 设置 HTTP 头信息的编码为 UTF-8
header('Content-Type: text/html; charset=UTF-8');
?>

解决方案

1. 统一字符编码

将所有相关的编码设置统一为 UTF-8:

  • HTML 页面:设置 <meta charset="UTF-8">
  • PHP 脚本:设置 header('Content-Type: text/html; charset=UTF-8');
  • 数据库:设置编码为 UTF-8
  • 文件:保存为 UTF-8 编码格式

2. 修复数据库编码

创建数据库时设置编码

sql
CREATE DATABASE myDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

修改现有数据库编码

sql
ALTER DATABASE myDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

修改表编码

sql
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

3. 修复 PHP 脚本编码

在 PHP 脚本开头添加编码设置:

php
<?php
// 设置编码为 UTF-8
header('Content-Type: text/html; charset=UTF-8');

// 输出内容
echo '中文测试';
?>

4. 修复文件编码格式

将 PHP 文件保存为 UTF-8 编码格式,确保文件本身的编码正确。

5. 使用 mbstring 扩展

使用 mbstring 扩展处理字符串,确保字符串编码正确:

php
<?php
// 设置内部编码为 UTF-8
mb_internal_encoding('UTF-8');

// 输出内容
echo mb_convert_encoding('中文测试', 'UTF-8');
?>

6. 修复表单提交编码

确保表单提交的数据编码正确:

html
<!-- 设置表单提交编码为 UTF-8 -->
<form method="post" action="process.php" accept-charset="UTF-8">
    <input type="text" name="username">
    <input type="submit" value="提交">
</form>

实战演练

场景:页面乱码

问题:访问 PHP 页面时,页面显示乱码。

排查步骤

  1. 检查 HTML 页面编码:确保 <meta charset="UTF-8"> 正确设置。
  2. 检查 PHP 脚本编码:确保 header('Content-Type: text/html; charset=UTF-8'); 正确设置。
  3. 检查文件编码格式:确保 PHP 文件保存为 UTF-8 编码格式。

解决方案

php
<?php
// 设置编码为 UTF-8
header('Content-Type: text/html; charset=UTF-8');
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>测试页面</title>
</head>
<body>
    <?php
    // 输出内容
    echo '中文测试';
    ?>
</body>
</html>

场景:数据库数据乱码

问题:从数据库读取的数据显示乱码。

排查步骤

  1. 检查数据库编码:确保数据库和表的编码为 UTF-8。
  2. 检查连接编码:确保连接数据库时设置了正确的编码。
  3. 检查 PHP 脚本编码:确保 PHP 脚本的编码设置正确。

解决方案

php
<?php
// 设置编码为 UTF-8
header('Content-Type: text/html; charset=UTF-8');

// 连接数据库
$conn = mysqli_connect('localhost', 'root', '', 'myDB');

// 设置数据库编码为 UTF-8
mysqli_set_charset($conn, 'utf8');

// 查询数据
$result = mysqli_query($conn, 'SELECT * FROM users');
$row = mysqli_fetch_assoc($result);
echo $row['name'];
?>

总结

乱码问题是 PHP 开发中常见的问题,通常由字符编码设置不一致、数据库编码设置错误、文件编码格式错误或 HTTP 头信息编码设置错误导致。通过统一字符编码、修复数据库编码、修复 PHP 脚本编码、修复文件编码格式和使用 mbstring 扩展,可以有效地解决乱码问题。

在开发过程中,应该注意以下几点:

  • 统一使用 UTF-8 编码
  • 在 PHP 脚本开头设置编码
  • 连接数据库时设置编码
  • 确保文件保存为 UTF-8 编码格式
  • 使用 mbstring 扩展处理字符串
  • 设置表单提交编码为 UTF-8

通过这些措施,可以减少乱码问题的发生,提高应用程序的用户体验。

© 2026 编程马·菜鸟教程 版权所有