yii中文乱码需同步修复数据库连接(dsn加charset=utf8mb4)、php文件utf-8无bom编码、控制台chcp 65001或iconv转码、mpdf/邮件等第三方组件专用配置,任一环节缺失均导致乱码。

Yii 框架中文乱码不是单一问题,而是编码链上多个环节断裂导致的——数据库连接、PHP 文件本身、HTTP 响应、控制台输出、PDF 生成等各自有各自的“字符集开关”,漏掉一个就乱码。
数据库连接必须显式声明 charset
Yii 不会自动从 MySQL 服务端继承 utf8mb4,哪怕你建库时指定了。只靠 'dsn' => 'mysql:host=127.0.0.1;dbname=test' 是不够的,必须手动加 charset 参数:
-
charset=utf8mb4是更稳妥的选择(支持 emoji 和生僻汉字),charset=utf8在老 MySQL 版本里可用,但实际只映射到utf8mb3,不推荐 - 配置位置在
config/db.php或config/main.php的components['db']中 - 如果用的是 MySQL 5.7+ 且已将表和字段设为
utf8mb4_unicode_ci,这里却写成utf8,查出来仍是乱码
PHP 文件自身编码必须是 UTF-8 无 BOM
很多编辑器(如旧版 EditPlus、Notepad++ 默认)保存 PHP 文件时用的是 ANSI 或 GBK,导致 return ['name' => '张三']; 这样的字面量一读就错:
- 用 VS Code 打开文件 → 右下角点编码名 → 选 “Save with Encoding” → “UTF-8”
- 避免选 “UTF-8 with BOM”,Yii 解析配置文件时遇到 BOM 会报
Parse error: syntax error -
config/main.php、messages/zh-CN/app.php等所有含中文的 PHP 文件都得过一遍
console 控制台输出中文乱码要分系统处理
Windows cmd/powershell 默认是 GBK,而 Yii 输出的是 UTF-8 字节流,直接显示就是方块或问号:
- 临时方案:运行前先执行
chcp 65001(切换当前窗口为 UTF-8) - 代码兼容方案:在
console/controllers里判断PATH_SEPARATOR === ';',对输出字符串调用iconv('UTF-8', 'GBK//IGNORE', $str) - 注意:不要用
mb_convert_encoding($str, 'GBK', 'UTF-8'),它在某些 Windows 环境下不可靠
mPDF / 邮件附件等第三方场景需单独补丁
这些不属于 Yii 核心流程,但一旦接入就容易暴露编码断层:
- mPDF 显示中文:光设 HTML meta
<meta charset="UTF-8">不够,必须把中文字体(如simsun.ttc)放进vendor/mpdf/mpdf/ttfonts/,再调用$mpdf->SetFont('simsun') - 邮件附件名乱码:不能用
$this->setHeaderParameter('Content-Disposition', 'filename', $filename),得改成$this->setHeaderParameter('Content-Disposition', 'attachment', "filename*=utf8''".urlencode($filename)) - 这些地方的乱码,往往调试半天才发现问题根本不在 Yii 配置里
真正麻烦的从来不是“怎么设 charset”,而是你得同时盯住至少四个层面:MySQL 连接串、PHP 源文件编码、HTTP 响应头、终端/第三方组件的字符集支持。任何一个脱节,中文就变问号——而且错误现象还不一样,有的是插入后查出来乱,有的是页面渲染乱,有的是导出 PDF 乱,排查时容易走偏。











