2014-08-28 71 views
0

首先我創建一個unicode對象,如:有什麼區別直接打印對象並在python中調用str函數後打印對象

test = u'\u015f\xfckr\xfc\xe7a\u011fl\xfcli' 

當我打印此對象;

>>> print test 
şükrüçağlüli 

但是,當我運行此命令時,我得到一個UnicodeEncodeError;

>>> print str(test) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) 

爲什麼會出現此錯誤?打印調用str函數,不是嗎?

+0

Unicode底漆:https://docs.python.org/2/howto/unicode.html – jonrsharpe 2014-08-28 10:51:23

回答

2

打印調用str函數,不是嗎?

不,不是Unicode字符串,它不。對於Unicode字符串,print保持原樣,並將值編碼爲sys.stdout對象;此對象會將Unicode值編碼爲您的終端或控制檯使用的編碼。

str()對Unicode值隱式編碼爲ASCII。如果必須將Unicode值轉換爲字節字符串,請明確編碼:

print test.encode('utf-8') 

會將UTF-8字節寫入您的終端。

寫入sys.stdout確實是同樣的事情,但使用sys.stdout.encoding來代替編碼的硬編碼。 sys.stdout.encoding反映了Python爲您的終端或控制檯檢測到的編碼。

file.encoding

這些文件使用的編碼。當Unicode字符串寫入文件時,它們將被轉換爲使用此編碼的字節字符串。另外,當文件連接到終端時,該屬性給出終端可能使用的編碼(如果用戶配置了終端,則該信息可能不正確)。該屬性是隻讀的,可能不會出現在所有類文件對象上。它也可能是None,在這種情況下,該文件使用系統默認編碼來轉換Unicode字符串。

file.encoding僅針對sys.std*文件對象設置,您不能從Python代碼設置屬性。

+0

這種行爲是否與Python 2和3相關? – 2014-08-28 11:24:46

+1

@SylvainLeroux:已更新;編碼實際上由文件對象來處理;這適用於Python 2和Python 3。 – 2014-08-28 11:35:10