6

我有以下 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() 没有相同的效果?

4

2 回答 2

2

该值仅用于指定解释器启动时输出的默认字符集。换句话说,一旦脚本启动并运行,您就为时已晚。

于 2012-08-03T17:37:16.177 回答
1

Unicode 就像只存在于程序中的文本概念。

它的优点是它可以支持任何字符,但缺点是它不能按原样输出,因此必须编码为某种可以显示的编码。

所以,你想要一些输入,它会被编码,你必须解码它,如果你想输出 unicode,你必须对其进行编码。

如果您不这样做,python 将尝试为您执行此操作(使用 ASCII,或您的环境中可能找到的内容,如您的情况),但您不应该依赖它,因为 python 可能会出错(如您的案子)。

非常有趣的是,您会注意到在您的情况下您的终端支持 utf8,但是 python 没有意识到它可能正在使用 utf8。

这就是为什么您应该始终对输出进行编码和对输入进行解码(最好尽可能使用 utf8!)

您可以使用 unicode 编码方法和字符串解码方法来实现这一点,并将编码作为参数。

于 2012-08-03T18:21:23.067 回答