Python 3使用环境变量LANG = C

时间:2016-08-29 12:45:50

标签: python python-3.x unicode locale

我有以下Python脚本:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print('☺')

当我在Debian系统上运行它时,它会产生以下输出,如预期的那样:

$ ./test.py 
☺
$ 

但是,当我将语言环境更改为“C”时,通过设置LANG环境变量,脚本会抛出UnicodeEncodeError

$ LANG=C ./test.py
Traceback (most recent call last):
  File "./test.py", line 4, in <module>
    print('\u263a')
UnicodeEncodeError: 'ascii' codec can't encode character '\u263a' in position 0: ordinal not in range(128)
$ 

此问题会阻止此脚本在最小环境中执行,例如在引导期间或嵌入式系统中。此外,我怀疑许多现有的Python程序可以通过LANG=C执行来打破。 {(3}}在程序的Stackoverflow上可能会因为它在“C”-locale中执行而破坏。

这是Python中的错误吗?防止这种情况的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

这是因为Python 3使用区域设置来推断输出字符编码;也就是说,当您执行locale命令时,Python将使用将为LC_CTYPE显示的语言环境:

% locale 
...
LC_CTYPE="en_US.UTF-8"
...

如果强制LC_CTYPEC,那么Python将假定ASCII应该用作输出编码。并且ASCII没有U+263A的映射。

如果您希望Python知道如何正确编码Unicode,请将LC_CTYPE设置为适当的值,或将二进制文件写入fd 1。