2012-08-07 102 views
4

蟒蛇編碼錯誤

$ 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)調用腳本時也會出現問題,但上面是我發現複製它的最簡單的方法。

我不明白這兩個調用之間有什麼區別。 任何人都可以幫忙嗎?

+0

好的。我絕對可以重現這一點。 – 2012-08-07 11:30:38

回答

7

這裏的問題是,在第二次調用中,您基本上正在寫入只接受字節串​​(類文件對象)的管道。如果您嘗試執行此同樣的情況:

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 
+1

很好的解釋。 – 2012-08-07 11:35:28

+0

@Tichodroma謝謝 – 2012-08-07 11:36:05

+0

通常一個終端也只接受字節串​​(在Windows上它可能直接接受Unicode)。區別在於Python是否知道適當的字符編碼或默認爲ascii – jfs 2012-08-07 11:45:09

2

正如你懷疑的那樣,當Python的標準輸出不是已知的終端時,Python不知道如何打印unicode。考慮在打印之前對字符串進行編碼:

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

請注意,調用程序和您的腳本需要在通用編碼中達成一致。