Django翻译触发UnicodeDecodeError错误,求解决方案
解决Django国际化中的UnicodeDecodeError问题
我来帮你搞定这个问题!先理清楚核心问题所在:
你执行这段代码时:
return _("%(user)s liked this") % {'user': likes.first().user.get_full_name()}
抛出了错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 11: ordinal not in range(128)
再看你提供的django.po片段,问题一下子就找到了——你的po文件把字符编码设置成了ASCII,但用户全名里包含了非ASCII字符(比如0xc5对应的是像Å这类特殊字符),ASCII编码根本处理不了这些字符,所以解码时直接报错了。
具体修复步骤:
修改po文件的字符编码
找到po文件里的Content-Type行,把charset=ASCII改成charset=UTF-8(UTF-8支持所有Unicode字符,这是核心修复点):"Content-Type: text/plain; charset=UTF-8\n"重新编译翻译文件
修改完po文件后,一定要运行Django的编译命令让改动生效:python manage.py compilemessages确保代码里的字符串处理安全
如果是使用Python2(从错误信息看大概率是),要确保用户全名是Unicode类型,避免编码冲突:return _("%(user)s liked this") % {'user': unicode(likes.first().user.get_full_name())}要是用Python3就不用额外处理了,默认字符串就是Unicode类型。
检查翻译文本的编码
如果你已经在po文件里添加了包含特殊字符的翻译内容,要确保po文件本身是用UTF-8编码保存的,别用记事本这类默认存ASCII的编辑器编辑。
这样改完之后,那个UnicodeDecodeError应该就彻底消失啦!
内容的提问来源于stack exchange,提问作者Anoop
相关产品推荐
相关产品推荐

