我有以下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中的错误吗?防止这种情况的最佳方法是什么?
答案 0 :(得分:3)
这是因为Python 3使用区域设置来推断输出字符编码;也就是说,当您执行locale命令时,Python将使用将为LC_CTYPE
显示的语言环境:
% locale
...
LC_CTYPE="en_US.UTF-8"
...
如果强制LC_CTYPE
到C
,那么Python将假定ASCII应该用作输出编码。并且ASCII没有U+263A
的映射。
如果您希望Python知道如何正确编码Unicode,请将LC_CTYPE
设置为适当的值,或将二进制文件写入fd 1。