2011-01-25 50 views
7

我想打印一個unicode字符串,其中沒有特定的編碼十六進制。我從Facebook上獲取這個數據,該數據在UTF-8的html標頭中有一個編碼類型。當我打印這個類型 - 它說它的unicode,但是當我嘗試用unicode-escape解碼時,說有編碼錯誤。爲什麼在我使用解碼方法時嘗試編碼?解碼函數嘗試編碼Python

代碼

a='really long string of unicode html text that i wont reprint' 
print type(a) 
>>> <type 'unicode'> 
print a.decode('unicode-escape') 
>>> Traceback (most recent call last): 
    File "scfbp.py", line 203, in myFunctionPage 
    print a.decode('unicode-escape') 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 1945: ordinal not in range(128) 

回答

8

這不是真實失敗的解碼。這是因爲你正試圖將結果顯示給控制檯。當你使用print時,它使用默認的ASCII編碼來編碼字符串。不要使用打印,它應該工作。

 
>>> a=u'really long string containing \\u20ac and some other text' 
>>> type(a) 
<type 'unicode'> 
>>> a.decode('unicode-escape') 
u'really long string containing \u20ac and some other text' 
>>> print a.decode('unicode-escape') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 30: ordinal not in range(128) 

我建議使用IDLE或其他可以輸出unicode的解釋器,那麼你不會得到這個問題。


更新:請注意,這是不一樣的少了一個反斜槓,它的解碼過程中失敗的situtation,但同樣的錯誤信息:

 
>>> a=u'really long string containing \u20ac and some other text' 
>>> type(a) 
<type 'unicode'> 
>>> a.decode('unicode-escape') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 30: ordinal not in range(128) 
+0

這不是他錯誤的原因。他正在嘗試解碼一個unicode對象。由於您從二進制數據解碼爲Unicode數據,因此Python 2將首先*編碼*它,它使用ascii編解碼器進行編碼。這就是失敗。 – 2011-01-26 11:49:43

+0

@Lennart Regebro:其實我懷疑他的字符串的實際類型是`str`,而不是`unicode`。看看他如何初始化字符串 - 注意沒有`u`。我認爲他所擁有的不是一個unicode字符串,而是一個* unicode-escaped *字符串(不一樣!)。這是他試圖解碼unicode。如果我的理論是正確的,那麼我認爲這個答案其實是正確的。 – 2011-01-26 11:55:54

3

當打印到控制檯Python嘗試將字符串編碼(轉換)爲終端的字符集。如果這不是UTF-8,或者沒有映射字符串中的所有字符,它會發出抱怨並拋出異常。

當我做數據的快速處理時,例如土耳其文字符,我時不時會遇到這種情況。

如果您通過Windows命令提示符運行python.exe,您可以在這裏找到一些解決方案:What encoding/code page is cmd.exe using。基本上你可以用chcp來改變代碼頁,但是很麻煩。我會遵循Mark's advice並使用類似IDLE的東西。

1
>>> print type(a) 
<type 'unicode'> 
>>> a.decode('unicode-escape') 

爲什麼想要當我使用的解碼方法編碼?

因爲你解碼 unicode的,你從編碼。你只是試圖將unicode字符串解碼爲unicode。然後它的第一件事就是嘗試使用ascii編解碼器將其轉換爲字符串。這就是爲什麼你會得到:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2110' in position 3: ordinal not in range(128) 

切記:Unicode不是一種編碼。其他所有內容,如ascii,utf8,latin-1等

這個隱式編碼在Python 3中不存在,因爲它混淆了人。