2011-04-22 129 views
12

我正在處理由python-lastfm庫返回的unicode字符串。在Python unicode字符串中處理錯誤編碼的字符

我假定某處路上,庫的編碼錯誤,並返回一個可能包含無效字符的unicode字符串。

例如,原來的字符串我在變量a期望是「格呂克」

 
>>> a 
u'Gl\xfcck' 
>>> print a 
Traceback (most recent call last): 
    File "", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 2: ordinal not in range(128) 

\ XFC爲轉義值252,其對應於「U」形的latin1編碼。不知何故,這將以python無法自行處理的方式嵌入unicode字符串中。

如何將其轉換回包含原始「Glück」的正常或unicode字符串?我嘗試瞭解解碼/編碼方法,但是得到了一個UnicodeEncodeError或者包含序列\ xfc的字符串。

+0

你使用的是什麼版本的Python? – 2011-04-22 23:30:16

+0

什麼操作系統?什麼是「sys.stdout.encoding」? – 2011-04-22 23:43:08

+0

[BeautifulSoup findall with class attribute-unicode encode error]可能的重複(http://stackoverflow.com/questions/5746888/beautifulsoup-findall-with-class-attribute-unicode-encode-error) – 2011-04-23 05:48:43

回答

7

你的unicode字符串的罰款:

>>> unicodedata.name(u"\xfc") 
'LATIN SMALL LETTER U WITH DIAERESIS' 

你在交互提示中看到的問題是,解釋不知道用什麼編碼輸出字符串到終端,所以它回落到「ascii」編解碼器 - 但是編解碼器只知道如何處理ASCII字符。它的工作原理在我的機器上的罰款(因爲sys.stdout.encoding是「UTF-8」我 - 很可能是因爲像我的環境變量設置不同於您)

>>> print u'Gl\xfcck' 
Glück 
+0

事實上,Mac和現代Linux桌面默認使用UTF-8控制檯,所以這是正常的。另一方面,Windows控制檯的標準C庫接口仍然存在一些特定於語言環境的代碼頁,其中沒有一個是UTF-8。Windows控制檯上的非ASCII字符總是一個試用版。 – bobince 2011-04-23 11:59:12

+0

@Bobince:用於Windows控制檯的「極少數特定於語言環境的代碼頁」中最流行的是cp850,與其他基於拉丁語的代碼相似,它很樂意正確顯示u-umlaut。如果您確實將unmmapped Unicode字符發送到Windows控制檯,則不會收到OP的消息討論** ascii **編解碼器的問題。你得到'UnicodeEncodeError:'charmap'編解碼器不能編碼字符u'\ u9876'在位置2:字符映射到'......我們仍然不知道爲什麼OP得到了這個錯誤。 – 2011-04-23 13:14:09

0

不要str()強制將字符串轉換爲字符串,只要它是一個unicode字符串。 (oops我完全錯過了,它不是Django相關的)

4

在代碼的開始處,剛剛導入後,添加這3行。

import sys # import sys package, if not already imported 
reload(sys) 
sys.setdefaultencoding('utf-8') 

它將覆蓋程序過程的系統默認編碼(ascii)。

編輯:除非您確定後果,否則不應該這樣做,請參閱下面的評論。這篇文章也有幫助:Dangers of sys.setdefaultencoding('utf-8')

+0

不要這樣做。 http://stackoverflow.com/questions/3828723/why-should-we-not-use-sys-setdefaultencodingutf-8-in-a-py-script – 2016-09-05 11:49:18