昔我往矣

语言环境变量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并不生效,那么修改碰碰运气:
成功运行

其实真正解决问题的过程是更加蜿蜒曲折,费时费力的。

参考文章https://wiki.archlinux.org/index.php/Locale)

当前暂无评论 »

添加新评论 »