为什么设置区域设置不能修复此 UnicodeError?



我有以下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方法和字符串解码方法来实现这一点,并将编码作为参数。

最新更新