为什么不设置语言环境修复此UnicodeError?

时间:2012-08-03 17:29:38

标签: python unicode utf-8 locale

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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

如果你不这样做,python会尝试为你做(使用ASCII,或者你的env中可能会找到的东西,如你的情况),但是你不应该依赖它,因为python可能会弄错(在你的情况下)。

非常有趣,你可以注意到你的终端支持utf8,但是python没有意识到它可以使用utf8。

这就是为什么总是编码输出和解码输入的原因(最好在可能的情况下使用utf8!)

您可以使用unicode编码方法和字符串解码方法实现此目的,并将编码作为参数。