2013-07-02 52 views
3

簡單的測試程序時編碼問題:蟒蛇...使用的編碼問題的Linux>

#!/bin/env python 
# -*- coding: utf-8 -*- 
print u"Råbjerg"  # >>> unicodedata.name(u"å") = 'LATIN SMALL LETTER A WITH RING ABOVE' 

這裏是我所得到的,當我使用它從Debian命令中,我不爲什麼使用重定向理解這裏打破了這個事情,因爲我可以在沒有使用時正確地看到它。

有人可以幫助理解我錯過了什麼嗎?以什麼樣的方式來打印這些角色,使他們在任何地方都可以?

$ python testu.py 
Råbjerg 

$ python testu.py > A 
Traceback (most recent call last): 
    File "testu.py", line 3, in <module> 
    print u"Råbjerg" 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe5' in position 1: ordinal not in range(128) 

使用Debian的Debian GNU/Linux的6.0.7(擠)配置有:

$ locale 
LANG=fr_FR.UTF-8 
LANGUAGE= 
LC_CTYPE="fr_FR.UTF-8" 
LC_NUMERIC="fr_FR.UTF-8" 
LC_TIME="fr_FR.UTF-8" 
LC_COLLATE="fr_FR.UTF-8" 
LC_MONETARY="fr_FR.UTF-8" 
LC_MESSAGES="fr_FR.UTF-8" 
LC_PAPER="fr_FR.UTF-8" 
LC_NAME="fr_FR.UTF-8" 
LC_ADDRESS="fr_FR.UTF-8" 
LC_TELEPHONE="fr_FR.UTF-8" 
LC_MEASUREMENT="fr_FR.UTF-8" 
LC_IDENTIFICATION="fr_FR.UTF-8" 
LC_ALL= 

編輯:請從下面的

#!/bin/env python1 
# -*- coding: utf-8 -*- 
import sys, locale 
s = u"Råbjerg"  # >>> unicodedata.name(u"å") = 'LATIN SMALL LETTER A WITH RING ABOVE' 
if sys.stdout.encoding is None: # if it is a pipe, seems python2 return None 
    s = s.encode(locale.getpreferredencoding()) 
print s 
+0

好的,謝謝,對不起,它有效地像你指出的帖子,並且在那裏的解釋很有趣。只要使用'import locale,sys;打印sys.stdout.encoding,locale.getpreferredencoding()'可以幫助理解管道行爲tty編碼vs None,當重定向時可以默認爲'ascii'。 – user1340802

回答

5

重定向輸出時,sys.stdout未連接到終端,Python無法確定輸出編碼。當不是指向輸出時,Python可以檢測到sys.stdout是TTY,並且將在打印unicode時使用爲該TTY配置的編解碼器。

設置PYTHONIOENCODING environment variable告訴Python在這種情況下使用什麼編碼,或者明確地編碼。

2

我會建議你將它輸出已經編碼:

print u"Råbjerg".encode('utf-8') 

這將寫入字符串的正確字節UTF-8,你就可以看到幾乎在每一個編輯器/控制檯其中支持utf-8