2012-08-03 79 views
6

我有以下Python脚本:为什么不设置语言环境修复此UnicodeError?

# -*- 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) 

然而,当我明确地设置LC_ALL环境变量的外壳,然后它工作

export LC_ALL=en_US.utf8 

所以我想知道为什么不setlocale()有相同的效果?

+0

你试过'en_US.utf-8'吗? – 2012-08-03 17:36:20

+0

是的,我试过,但结果相同 – trinth 2012-08-03 17:40:51

+0

你试过.encode('utf-8')你的输出吗? – 2012-08-03 17:56:04

回答

2

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

+0

在这种情况下,为什么该方法存在?看起来像我唯一的选择是手动设置环境变量.. – trinth 2012-08-03 17:43:48

1

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

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

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

如果你不这样做,python会尝试为你做(使用ASCII,或者你的env中可能发现的东西,就像你的情况一样),但是你不应该依赖这个,因为python可能会错误的(如你的情况)。

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

这就是为什么你应该总是编码输出和解码输入(最好尽可能使用UTF-8!)

您可以在此使用Unicode编码方法和字符串解码方法,让他们的编码作为参数实现。

相关问题