2011-11-28 10 views
10

Sono in uno scenario in cui chiamo api e in base ai risultati di api chiamo database per ogni record che ho in API. Le mie stringhe di ritorno chiamata api e quando faccio la chiamata al database per gli elementi restituiti da API, per alcuni elementi ottengo il seguente errore.Python: UnicodeEncodeError: il codec 'latin-1' non può codificare il carattere

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) 

Il segmento del mio codice l'errore sopra riportato si riferisce è:

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

Dopo aver fatto qualche ricerca su google ho provato quanto segue sulla mia linea di comando per capire cosa sta succedendo ...

>>> 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' 

Ma non sono sicuro quale sarebbe la soluzione per superare questo problema. Inoltre non so quale sia la teoria che sta dietro allo encode('cp1252') sarebbe fantastico se riuscissi a ottenere qualche spiegazione su ciò che ho provato sopra.

+1

Possibile duplicato [UnicodeEncodeError : il codec 'latin-1' non può codificare il carattere] (http://stackoverflow.com/questions/3942888/unicodeencodeerror-latin-1-codec-cant-encode-character) –

risposta

12

Se avete bisogno di Latin-1 codifica, sono disponibili diverse opzioni per sbarazzarsi del en-dash o altri punti di codice di sopra di 255 (caratteri non inclusi in latino-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' 

O fare il vostro proprie sostituzioni personalizzate:

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

Se non viene richiesto di uscita Latin-1, quindi UTF-8 è una scelta comune e preferito. Si raccomanda dal W3C e ben codifica tutti i punti codice Unicode:

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

Il carattere unicode u '\ 02013' è il "trattino". È contenuto nel set di caratteri Windows-1252 (cp1252) (con la codifica x96), ma non nel set di caratteri Latin-1 (iso-8859-1). Il set di caratteri di Windows 1252 ha altri caratteri definiti nel sono x80 - x9f, tra cui il trattino.

La soluzione sarebbe scegliere un set di caratteri di destinazione diverso da Latin-1, come Windows-1252 o UTF-8 o sostituire il trattino con un semplice "-".

Problemi correlati