2011-11-28 11 views
10

Jestem w scenariuszu, w którym wywołuję api i na podstawie wyników z api I wywołuję bazę danych dla każdego rekordu, który mam w api. Moje ciągi wywołań api wywołania i kiedy wywołuję bazę danych dla zwracania elementów przez api, dla niektórych elementów otrzymuję następujący błąd.Python: UnicodeEncodeError: kodek 'latin-1' nie może kodować znaków

Traceback (most recent call last): 
    File "TopLevelCategories.py", line 267, in <module> 
    cursor.execute(categoryQuery, {'title': startCategory}); 
    File "/opt/ts/python/2.7/lib/python2.7/site-packages/MySQLdb/cursors.py", line 158, in execute 
    query = query % db.literal(args) 
    File "/opt/ts/python/2.7/lib/python2.7/site-packages/MySQLdb/connections.py", line 265, in literal 
    return self.escape(o, self.encoders) 
    File "/opt/ts/python/2.7/lib/python2.7/site-packages/MySQLdb/connections.py", line 203, in unicode_literal 
    return db.literal(u.encode(unicode_literal.charset)) 
UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2013' in position 3: ordinal not in range(256) 

Segment mojego kodu powyższego błędu odsyłający jest:

  ...  
     for startCategory in value[0]: 
      categoryResults = [] 
      try: 
       categoryRow = "" 
       baseCategoryTree[startCategory] = [] 
       #print categoryQuery % {'title': startCategory}; 
       cursor.execute(categoryQuery, {'title': startCategory}) #unicode issue 
       done = False 
       cont... 

Po jakiejś wyszukiwarki Google Próbowałem następujących w moim wierszu polecenia, aby zrozumieć, co się dzieje ...

>>> import sys 
>>> u'\u2013'.encode('iso-8859-1') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2013' in position 0: ordinal not in range(256) 
>>> u'\u2013'.encode('cp1252') 
'\x96' 
>>> '\u2013'.encode('cp1252') 
'\\u2013' 
>>> u'\u2013'.encode('cp1252') 
'\x96' 

Ale nie jestem pewien, jaki byłby sposób rozwiązania tego problemu. Też nie wiem, jaka jest teoria, za którą byłbym w stanie uzyskać jakieś wyjaśnienie tego, co próbowałem powyżej.

+1

Możliwy duplikat [UnicodeEncodeError : kodek "latin-1" nie może kodować znaków] (http://stackoverflow.com/questions/3942888/unicodeencodeerror-latin-1-codec-cant-encode- character) –

Odpowiedz

12

Jeśli potrzebujesz Latin-1 kodowanie, masz kilka opcji, aby pozbyć się en-myślnik lub innych punktów kodowych powyżej 255 (znaków nieujętych w Latin-1):

>>> u = u'hello\u2013world' 
>>> u.encode('latin-1', 'replace') # replace it with a question mark 
'hello?world' 
>>> u.encode('latin-1', 'ignore')  # ignore it 
'helloworld' 

Albo zrobić swoje własne niestandardowe zamienniki:

>>> u.replace(u'\u2013', '-').encode('latin-1') 
'hello-world' 

Jeśli nie ma potrzeby wyprowadzania Latin-1, to UTF-8 jest powszechnym i preferowanym wyborem. Jest on zalecany przez W3C i ładnie koduje wszystkie Unicode punkty kodowe:

>>> u.encode('utf-8') 
'hello\xe2\x80\x93world' 
2

Znak Unicode u '\ 02013' to "en dash". Znajduje się on w zestawie znaków Windows-1252 (cp1252) (z kodowaniem x96), ale nie w zestawie znaków Latin-1 (izo-8859-1). Zestaw znaków Windows-1252 ma więcej znaków zdefiniowanych w x80 - x9f, w tym en dash.

Rozwiązaniem byłoby, gdybyś wybrał inny zestaw znaków docelowych niż Latin-1, taki jak Windows-1252 lub UTF-8, lub zastąpienie en-plash prostym "-".

Powiązane problemy