6

一个简单的文件,如

$ cat x.py
x = u'Gen\xe8ve'
print x

运行时会给我:

$ python x.py
Genève

但是,当作为“命令替换”运行时,将给出:

$ echo $(python x.py)
...
UnicodeEncodeError: 'ascii' codec...

我尝试过使用不同的终端仿真器(xterm、gnome-term)和 ttyS 上的控制台。使用 bash 和 sh。使用 python2.4 和 2.7。在运行 python 之前,我尝试将 LC_ALL 或 LANG 设置为一些 utf-8 语言环境。我检查了 sys.getdefaultencoding()。没有任何帮助。

当从另一个进程(如java)调用脚本时也会出现问题,但上面是我发现复制它的最简单方法。

我不明白这两个电话之间有什么区别。任何人都可以帮忙吗?

4

2 回答 2

9

这里的问题是,在第二次调用中,您基本上是在写入一个只接受字节串​​(类文件对象)的管道。如果您尝试执行此操作,也会发生同样的情况:

python x.py > my_file
Traceback (most recent call last):
File "x.py", line 2, in <module>
    print x
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe8' in position 3: ordinal not in range(128)

由于接收者只理解字节串而不是 unicode 字符,因此您必须首先使用以下encode函数将 unicode 字符串编码为字节串:

x = u'Gen\xe8ve'.encode('utf-8') 
print x

这将打印编码为 utf-8 字节串(字节序列)的 unicode 字符串,允许将其写入类似文件的对象。

$echo $(python x.py)
Genève
$python x.py 
Genève
于 2012-08-07T11:33:32.527 回答
3

正如您所怀疑的,当 Python 的标准输出不是已知终端时,Python 不知道如何打印 unicode。考虑在打印之前对字符串进行编码:

# coding: utf-8
x = u'Gen\xe8ve'
print x.encode("utf-8")

请注意,调用程序和您的脚本将需要在通用编码中达成一致。

于 2012-08-07T11:31:32.133 回答