我有以下Python脚本:
# -*- coding: utf-8 -*-
import sys, locale
locale.setlocale(locale.LC_ALL, 'en_US.utf8')
print '肥皂' # This works
print u'肥皂'
当运行脚本时,我得到:
肥皂
Traceback (most recent call last):
File "../pycli/samples/x.py", line 5, in <module>
print u'肥皂'
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256)
然而,当我在shell中显式设置LC_ALL环境变量时,它就可以工作
export LC_ALL=en_US.utf8
所以我想知道为什么setlocale()没有同样的效果?
该值仅用于指定解释器启动时输出的默认字符集。换句话说,一旦脚本启动并运行,你就太晚了。
Unicode就像一个只存在于程序中的文本概念。
它的优点是可以支持任何字符,但缺点是不能按原样输出,因此必须编码为可以显示的某种编码。
所以,你想要一些输入,它将被编码,你必须解码,如果你想输出unicode,你必须编码它
如果你不这样做,python会尝试为你做(使用ASCII,或者在你的环境中可能找到的东西,就像在你的情况下一样),但你不应该依赖它,因为python可能会出错(就像你的情况一样)。
非常有趣的是,您可以注意到,在您的情况下,您的终端支持utf8,但python没有意识到它可能使用utf8。
这就是为什么你应该总是编码输出和解码输入(最好尽可能使用utf8!)
您可以使用unicode encode方法和字符串解码方法来实现这一点,并将编码作为参数。