WordPress与MySQL中UTF-8编码乱码问题求助
解决多语言内容存入数据库后WordPress显示乱码的问题
兄弟,这问题我见太多了——典型的UTF-8双重编码搞出来的乱码!咱们来一步步搞定它:
1. 先砍掉错误的utf8_encode()调用
你看到的è、societÃ这类乱码,根源就是这个函数。utf8_encode()的作用是把ISO-8859-1(Latin-1)编码的字符串转成UTF-8,但如果你的原始内容本身已经是UTF-8编码,再用这个函数就会把它当成ISO-8859-1重新转码,直接导致双重编码,最终显示出一堆乱码字符。
2. 确保数据库连接和表的编码是utf8mb4
这是多语言支持的关键,别用老的utf8(它只能支持部分Unicode字符):
- 在调用
mysqli_real_escape_string之前,必须设置数据库连接的字符集:
这个设置会让MySQL知道你传递的字符串是UTF-8编码,避免存储时再做错误转码。mysqli_set_charset($con, 'utf8mb4'); - 检查你的数据库表和对应字段,确保字符集设置为
utf8mb4,排序规则选utf8mb4_unicode_ci(比general_ci的排序更准确)。
3. 修正后的完整代码示例
// 先设置数据库连接字符集,这步必须放在转义之前 mysqli_set_charset($con, 'utf8mb4'); // 处理内容源 $source = stripslashes($source); // 移除utf8_encode(),它是乱码的罪魁祸首 $source = mysqli_real_escape_string($con, $source);
4. 额外检查WordPress的编码设置
登录WordPress后台,进入「设置-常规」,确认「站点字符集」是UTF-8;另外你的主题模板文件也要保存为UTF-8无BOM格式(大部分代码编辑器都能设置),避免前端渲染时再出问题。
如果还想验证原始内容的编码,可以临时加一行代码:
echo mb_detect_encoding($source);
如果输出是UTF-8,就完全没必要用utf8_encode();如果是ISO-8859-1,那才需要转,但你的情况明显是转多了。
内容的提问来源于stack exchange,提问作者Jacopo Sciampi
相关产品推荐
相关产品推荐

