本文约 2,860 字,预计阅读 8 分钟。文中命令与配置均经过实测,可直接参考执行。
引言
换上中文主题或从别处导入内容后,前台出现一堆看不懂的乱码:本该是「你好」的地方变成「ä½ å¥½」或「????」,标题里冒出黑方块;有的站点字没乱,但中文用的是西文字体,笔画发虚、标点挤在一起,甚至加粗后糊成一团。这些都属于「中文主题乱码或字体显示异常」。它牵涉两个层面:一是编码(字符被存错或声明错,导致乱码),二是字体(页面没加载合适的中文字体,导致显示难看)。两者原因不同、修法也不同,下面分开讲清楚,照做基本都能恢复正常的中文显示。
故障原因分析
- 数据库或表编码不是 UTF-8:导入数据库时用了 GBK/latin1,中文存进去就已损坏,前端无论怎么改都是乱码。
- 页面字符集声明错误或缺失:
<head>里的<meta charset="UTF-8">缺失或写成其他编码,浏览器用错编码解析。 - 主题 PHP 文件编码不一致:主题文件保存成 GBK/ANSI,与页面声明的 UTF-8 冲突,输出乱码。
- 字体未按中文加载:主题
font-family里只有西文字体(如 Helvetica、Arial),中文回退到系统默认,导致忽胖忽瘦。 - Web 字体缺少中文字形:只加载了西文子集(Latin subset)的 Web Font,中文没有对应字形,显示为方框或回退。
- 字体文件编码/压缩异常:字体或样式表传输编码错误,导致 CSS 乱码、图标或中文不正常。
- 缓存残留:旧页面被缓存,改了编码/字体也看不到变化。
分步解决方案
方法一:核对并统一数据库编码
用 phpMyAdmin 打开数据库,查看数据库与表的整理方式(Collation)应为 utf8mb4_general_ci 或 utf8mb4_unicode_ci。若发现是 latin1、gbk,不要简单直接改,容易二次损坏:
- 先完整导出备份;
- 若是本次导入造成的乱码,重新用 UTF-8 编码的正确 SQL 文件导入;
- 确认导入时「文件编码」选 UTF-8;
连接层面,可在 wp-config.php(站点根目录的配置文件,父子主题共用一份)确认:
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', 'utf8mb4_unicode_ci' );
若数据库已是 utf8mb4 但某张表是旧编码,可在 phpMyAdmin 对该表执行「操作 → 转换整理」,转换前务必先备份。
方法二:确认页面字符集声明
在主题 header.php 的 <head> 中,应有:
<meta charset="<?php bloginfo( 'charset' ); ?>">
这行会输出站点设定的字符集(默认 UTF-8)。若被硬编码成 gb2312 或干脆没有,就会出现乱码。把它改回上面这种写法;同样要注意——改动放子主题,不要直接动父主题,否则更新后被覆盖。
方法三:统一主题文件编码为 UTF-8 无 BOM
用 VS Code / Notepad++ 打开主题里出现乱码的 PHP 文件,把文件编码转成「UTF-8(无 BOM)」再保存。带 BOM 会在输出最前面插入隐形字节,导致「Cannot modify header information」或页面顶部多出空白与乱码。
- Notepad++:编码 → 转为 UTF-8 → 编码 → 存为 UTF-8 无 BOM;
- VS Code:右下角编码 → Save with Encoding → UTF-8。
逐个检查你改过的模板,尤其是从他人处复制来的片段。
方法四:为中文配置合适的字体栈
在子主题的样式里,给正文字体加上中文优先的字体栈,避免只声明西文字体:
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI",
"PingFang SC", "Hiragino Sans GB", "Microsoft YaHei",
"微软雅黑", "Source Han Sans SC", "Noto Sans CJK SC", sans-serif;
}
顺序原则:先放系统自带且中文字形完整的中文字体(如苹方、微软雅黑、思源黑体),再放通用 sans-serif 兜底;把西文字体放在最前可让英文更精致,但必须保证中文字体在其中,否则中文会回退得很难看。
方法五:正确加载中文 Web 字体子集
若坚持用 Google Fonts 之类做中文,务必选择包含中文字形的字体(如 Noto Sans SC),并注意中文体积很大,建议用工具做「字集子集化」(只保留站内用到的字)后再自托管:
@font-face {
font-family: "MyCN";
src: url("/wp-content/uploads/fonts/mysite-cn.woff2") format("woff2");
font-display: swap;
unicode-range: U+4E00-9FFF; /* 基本汉字区,按需调整 */
}
font-display: swap 可避免字体未加载完时文字不可见;unicode-range 只对中文段生效,减少对西文的影响。
方法六:清缓存与验证
改完编码和字体后,清浏览器缓存、WordPress 缓存插件、opcache 与 CDN,再查看页面:中文是否正常、字体是否统一。可用浏览器开发者工具看 Computed 里的 font-family,确认最终生效的是哪个字体。
常见踩坑点
- 直接改数据库编码:不做备份就转换,极易二次损坏中文,务必先导出。
- 以为乱码只是”字体问题”:乱码基本是编码问题,字体只影响美观,别混淆。
- 文件带 BOM:转码时误存成「UTF-8 with BOM」,会引发头部报错与多余空白。
- 只声明西文字体:
font-family: Arial;会让中文回退到默认字体,粗细不一。 - 给中文加载完整字体:几 MB 的中文字体会严重拖慢加载,应做子集化并自托管。
- 改父主题:编码与字体样式都应写进子主题,避免被更新覆盖。
总结
中文主题出现乱码或字体异常,先要分清是「编码」还是「字体」:前者看数据库与表是否为 utf8mb4、页面是否有正确的 <meta charset>、主题文件是否保存为 UTF-8 无 BOM,按这个顺序排查能解决绝大多数乱码;后者则要在子主题样式里给出包含中文的字体栈,避免只用西文字体,如果用中文 Web 字体记得做子集化并自托管以控制体积。处理过程中坚持先备份数据库、改动写子主题、改完清缓存,WordPress中文乱码与字体显示异常就能被稳妥修复,站点也能呈现清晰、统一的中文排版。
