语言环境变量LANG和LANGUAGE
2016年02月21日
作为5年的重度Linux桌面用户,2年前改投elementary os之后,越来越少折腾了。对Linux桌面版有兴趣的建议尝试下这款操作系统,免费广告完毕。
前天,某童鞋发过来类似如下的信息:
一堆不知所云的方块,就是神仙看到也没辙,由于是在tty下不能显示中文,那么转成英文的吧,毕竟咱大学英语四级也不是抄来的。按照经验,一般先把LANG设置成空就OK了。
Google了也没找到真正有效的方案,依旧报错:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)
初生牛犊不怕虎,于是打开do-release-upgrade的源码,看看能不能找出什么端倪。结合报错信息,可以判断是_()这个函数导致的问题,把print(_(...))这种语句可以改成print(...)应该可以解决问题,问题不大,就是很不优雅。接着往下看到了_()的定义,以及关于这个bug的描述:
46 if __name__ == "__main__":
47
48 #FIXME: Workaround a bug in optparser which doesn't handle unicode/str
49 # correctly, see http://bugs.python.org/issue4391
50 # Should be resolved by Python3
51 gettext.bindtextdomain("ubuntu-release-upgrader", "/usr/share/locale")
52 gettext.textdomain("ubuntu-release-upgrader")
53 translation = gettext.translation("ubuntu-release-upgrader", fallback=True)
54 if sys.version >= '3':
55 _ = translation.gettext
56 else:
57 _ = translation.ugettext
58
59 try:
60 locale.setlocale(locale.LC_ALL, "")
61 except:
62 pass
注释中给出了这个bug的详细地址,但似乎并未修复。
继续想办法,locale是和当前环境相关的环境变量,除了LANG之外,还有很多其它的属于locale的环境变量,但是大多数都和这个问题不相关,而且不常用。最后锁定了如下三个环境变量:
- LANG 没有设置的locale环境变量默认使用LANG的值
- LANGUAGE 使用 gettext 翻译的软件会按照 LANGUAGE 选择使用的语言
- LC_ALL 这个变量的值会覆盖掉 LANG 和所有 LC_* 变量的值,无论它们是否设置.
这三个环境变量在我的系统中初始值如下:
$ locale
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN
LC_ALL=
可以看到上面的Python代码确实有涉及到gettext,可能因为如此,所以修改LANG并不生效,那么修改碰碰运气:
其实真正解决问题的过程是更加蜿蜒曲折,费时费力的。
当前暂无评论 »