2015-06-02 90 views
0

我已經嘗試了所有以前的答案和解決方案。'ascii'編解碼器無法編碼字符u' xe9'

我想使用這個值,這給了我編碼相關的錯誤。

ar = [u'http://dbpedia.org/resource/Anne_Hathaway', u'http://dbpedia.org/resource/Jodie_Bain', u'http://dbpedia.org/resource/Wendy_Divine', u'http://dbpedia.org/resource/Jos\xe9_El\xedas_Moreno', u'http://dbpedia.org/resource/Baaba_Maal'] 

所以,我想,

d = [x.decode('utf-8') for x in ar] 

這給:

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

我嘗試了

d = [x.encode('utf-8') for x in ar] 

從而消除錯誤,但改變了原來的內容

原值爲u'http://dbpedia.org/resource/Jos\xe9_El\xedas_Moreno'其轉化爲'http://dbpedia.org/resource/Jos\xc3\xa9_El\xc3\xadas_Moreno'同時使用encode

什麼是對付這種情況下正確的方法是什麼?

編輯

錯誤是當我在

req = urllib2.Request() 
+1

[UnicodeEncodeError:'ascii'編解碼器無法在位置20編碼字符u'\ xa0':序號不在範圍內(128)]的可能重複(http://stackoverflow.com/questions/9942594/unicodeencodeerror- ascii-codec -cant-encode-character -u-xa0-in-position-20) – sirfz

+0

你想對數據做什麼? ASCII編碼不支持這些字符。這就是爲什麼我們編碼如uff-8。如果您計劃在野外使用此應用程序,我強烈建議您跳過ASCII碼。 –

+3

如果你已經有unicode字符串,那麼你不想把它們解碼成unicode字符串。 :-)您可能想要與需要非Unicode字符串的內容進行交互,這意味着通過encode()將其放入可接受的編碼中。現在,通常是UTF-8,但這取決於你想要做什麼以及與之交互的服務。 – jszakmeister

回答

2

養活這些鏈接的字符串的第二個版本是你原來的unicode字符串的正確的UTF-8表示。如果要進行有意義的比較,則必須對存儲的字符串和用戶輸入字符串使用相同的表示法。在這裏要做的理智是總是在內部使用Unicode字符串(在您的代碼中),並確保您的用戶輸入和存儲的字符串都正確解碼爲 unicode從它們各自的編碼在系統邊界(存儲子系統和用戶輸入子系統)。

此外,您似乎對unicode和編碼有點困惑,因此閱讀thisthis可能會有所幫助。

1

Unicode strings python是"raw" unicode,所以一定要確保它們是.encode().decode()。使用utf8編碼被認爲是全球多個開發組中的最佳實踐。 要編碼使用quote功能從urllib2庫:

from urllib2 import quote 
escaped_string = quote(unicode_string.encode('utf-8')) 

爲了解碼,使用unquote

from urllib2 import unquote 
src = "http://dbpedia.org/resource/Jos\xc3\xa9_El\xc3\xadas_Moreno" 
unicode_string = unquote(src).decode('utf-8') 

另外,如果你更感興趣的是Unicode和UTF-8的工作,檢查了Unicode HOWTO

0

在您的Unicode列表中,u'http://dbpedia.org/resource/Jos\xe9_El\xedas_Moreno'是表示Unicode字符串的ASCII安全方式。當以支持完整西歐字符集的格式(如UTF-8)編碼時,它是:http://dbpedia.org/resource/José_Elías_Moreno

您的.encode("UTF-8")是正確的,在UTF-8編輯器或瀏覽器中看起來不錯。您在編碼之後看到的是UTF-8的ASCII安全表示。

例如,你的麻煩字符是é和í。

é = 00E9 Unicode = C3A9 UTF-8 
í = 00ED Unicode = C3AD UTF-8 

總之,你.encode()方法是正確的,應該用於寫入文件或瀏覽器。

相關問題