2016-08-25 158 views
0

我檢索歌曲ids一長串從API的,我就是其中追加到列表中遇到問題:編碼字符

track_ids = [spotify:id:1,spotify:id:2 ...] 

latetr上,曲值被傳遞給函數,爲了得到相應的歌曲名稱,以這種方式:

(...) 
for i, x in enumerate(values): 
     if x > threshold: 
      track_name = sp.track(track_ids[i])['name'] 
      xsongs.append(track_name) 
      print product.upper(),'-', "{} = {}".format(track_name, x), filter_name 

但是當我運行該腳本歌曲名稱列表輸出停止顯示以下錯誤:

print product.upper(),'-', "{} = {}".format(track_name, x), filter_name UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 7: ordinal not in range(128)

編輯

以下行固定它:

xsongs.append(track_name.encode("utf-8")) 
+2

什麼代碼實際上觸發了錯誤?通常情況下,當你試圖用只有字符串的unicode對象做某些事情時,會發生這種問題,所以它會嘗試使用「安全」編碼將它們編碼爲「str」(一種絕對可以由您的計算機表示的編碼) ;不幸的是,這意味着僅僅使用ASCII,顯式編碼有時可以工作,或者使用不需要轉換爲'str'的​​Unicode友好庫(或者使用Py3,Unicode總體上更友好) – ShadowRanger

+0

'results' is list或字符串?如果它是一個列表,你應該編碼單個元素,如果它是一個字符串,你可以將它轉換爲列表,然後解碼元素 –

+0

@EmL這是一個列表,我該怎麼做? –

回答

0

你可以列出的每一個元素進行編碼。如果你的文件系統編碼爲utf-8,你可以嘗試:

results = [value.encode('utf-8') for value in results] 
print(results) 
+0

我仍然得到這個:'songs = [value.decode('utf-8')for sample_songs] File「/System/Library/Frameworks/Python.framework/Versions/2. 7/lib/python 2.7 /編碼7; utf_8.py「,第16行解碼返回codecs.utf_8_decode(input,errors,True)UnicodeEncodeError:'ascii'編解碼器無法在位置7編碼字符u'\ u2019':序號不是(128)' –

+0

將'# - * - coding:utf-8 - * - '添加到您的py文件頭中。 –

+0

已經完成了... –

0

在您的示例中的字符串已解碼的,因爲它們是Unicode字符串。您無法再次解碼Unicode字符串,因此Python 2使用ascii編解碼器將其隱式編碼回字節字符串,因此「Unicode 編碼錯誤」。您擁有的字符串是正確的,您只會看到非ASCII字符的轉義碼,這是打印列表時的默認值。打印各個串來代替:

results = [u'Magic Carpet Ride', u'La Grange', u'Tausendmal ber\xfchrt', 
      u'Funkelperlenaugen',u'Lied F\xfcr All Die Vergessenen'] 

for r in results: 
    print r 

輸出:

Magic Carpet Ride 
La Grange 
Tausendmal berührt 
Funkelperlenaugen 
Lied Für All Die Vergessenen 
+0

問題依然存在。請參閱問題編輯。 –