使用PoEdit生成messages.mo时UTF-8编码下重音显示异常问题
解决PHP Gettext重音字符乱码问题
我之前也碰到过几乎一模一样的gettext重音字符显示乱码问题,结合你给出的代码和现象,咱们一步步排查解决:
关键修复步骤
添加gettext编码指定:这是最容易漏掉的核心步骤,在
bindtextdomain之后加上bind_textdomain_codeset($domain, 'UTF-8');,强制gettext使用UTF-8编码读取.mo文件,确保解析出来的字符是正确的。确保系统locale是UTF-8版本:
setlocale(LC_ALL, $lang);里的fr_FR可能没有关联到UTF-8编码的locale,建议直接指定为fr_FR.UTF-8,同时检查系统是否安装了该locale:- Linux下执行
locale -a查看已安装的locale,如果没有fr_FR.UTF-8,需要安装对应的语言包(比如Debian/Ubuntu用apt install locales locales-fr,再执行dpkg-reconfigure locales生成该locale)。
- Linux下执行
PoEdit导出设置验证:打开PoEdit,确认:
- 首选项→编辑器里的编码是UTF-8且无BOM;
- 编译.mo文件时,在「文件→编译为MO」的选项中,确保编码选择UTF-8,不要选其他格式。
补充PHP内部编码设置:在PHP代码开头添加两行,确保PHP内部处理和输出的编码统一为UTF-8:
mb_internal_encoding('UTF-8'); mb_http_output('UTF-8');
修改后的完整PHP代码
<?php mb_internal_encoding('UTF-8'); mb_http_output('UTF-8'); $dir = "../locale"; $lang="fr_FR.UTF-8"; $domain="messages"; putenv("LANG=$lang"); setlocale(LC_ALL, $lang); bindtextdomain ($domain, $dir); bind_textdomain_codeset($domain, 'UTF-8'); // 新增关键行 textdomain ($domain); echo gettext("TEST 1") . "\n"; echo __("Test 2"); ?>
额外验证步骤
可以用file命令检查生成的.mo文件编码是否正确:
file locale/fr_FR/LC_MESSAGES/messages.mo
如果输出显示类似「UTF-8 Unicode text」,说明编码没问题;如果是其他编码,就得重新调整PoEdit的导出设置。
内容的提问来源于stack exchange,提问作者neggenbe
相关产品推荐
相关产品推荐

