温馨提示×

ubuntu php为何乱码

小樊
39
2026-09-16 13:27:06
栏目: 编程语言

在 Ubuntu 上运行 PHP 出现乱码,通常不是 PHP 本身的问题,而是字符编码不一致导致的。下面按常见原因给你系统梳理一下。


一、最常见原因:编码不一致

乱码本质:写进去的编码 ≠ 读出来的编码 ≠ 浏览器显示的编码

1. PHP 文件本身编码不对

如果你的 PHP 文件是 GBK / GB2312,但服务器按 UTF-8 解析,就会乱码。

✅ 解决:

  • 用编辑器(VS Code / PHPStorm)把文件保存为 UTF-8(无 BOM)
  • 检查方式:
file -i yourfile.php

二、PHP 未指定正确编码(非常常见)

2. 没有设置 HTTP 头

PHP 默认不告诉浏览器用什么编码。

✅ 在 PHP 最前面加:

header("Content-Type: text/html; charset=utf-8");

⚠️ 必须在任何输出之前(包括空格、换行)


三、HTML 页面未声明编码

即使 PHP 对了,HTML 也要声明。

✅ 在 <head> 中:

<meta charset="UTF-8">

四、MySQL 数据库编码问题(超常见)

3. 数据库 / 表 / 字段编码不一致

例如:

  • 数据库是 utf8mb4
  • 表是 utf8
  • 连接是 latin1

✅ 解决步骤:

(1)查看数据库编码

SHOW VARIABLES LIKE 'character_set%';

(2)PHP 连接数据库时指定编码

MySQLi:

$mysqli->set_charset("utf8mb4");

PDO:

new PDO(
  "mysql:host=localhost;dbname=test;charset=utf8mb4",
  $user, $pass
);

(3)数据库建议统一

  • 数据库:utf8mb4
  • 表:utf8mb4
  • 连接:utf8mb4

五、终端 / CLI 模式乱码

如果你是在 Ubuntu 终端运行 PHP 脚本乱码:

php test.php

✅ 检查终端编码:

locale

应该是:

LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8

如果不是:

sudo apt install locales
sudo dpkg-reconfigure locales

六、Nginx / Apache 配置问题

Nginx

charset utf-8;

Apache

AddDefaultCharset UTF-8

七、BOM 导致的问题(隐蔽)

如果 PHP 文件带 UTF-8 BOM,可能出现:

  • 头部多出空格
  • session 报错
  • 偶尔乱码

✅ 解决:

  • 用编辑器转成 UTF-8 无 BOM

快速自检清单 ✅

  • [ ] PHP 文件是 UTF-8 无 BOM
  • [ ] 有 header("Content-Type: text/html; charset=utf-8")
  • [ ] HTML 有 <meta charset="UTF-8">
  • [ ] 数据库和连接都是 utf8mb4
  • [ ] 终端 locale 是 UTF-8
  • [ ] Web 服务器设置了 UTF-8

如果你愿意,可以把:

  • 乱码截图
  • PHP 代码
  • 数据库类型(MySQL?)
  • 是网页还是命令行

发出来,我可以直接帮你定位是哪一步出的问题。

0