2011-11-28 16 views
10

Estoy en un escenario donde llamo api y en función de los resultados de la API llamo a la base de datos para cada registro que tengo en la API. Mis cadenas de retorno de llamada de API y cuando hago la llamada a la base de datos para los elementos devueltos por API, para algunos elementos obtengo el siguiente error.Python: UnicodeEncodeError: el códec 'latin-1' no puede codificar el carácter

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) 

El segmento de mi código del error anterior se refiere es:

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

Después de hacer algunas búsqueda de google He intentado lo siguiente en mi línea de comandos para entender lo que pasa ...

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

Pero no estoy seguro de cuál sería la solución para solucionar este problema. Además, no sé cuál es la teoría detrás de encode('cp1252') sería genial si puedo obtener alguna explicación sobre lo que probé anteriormente.

+1

duplicado posible de [UnicodeEncodeError : el códec 'latin-1' no puede codificar el carácter] (http://stackoverflow.com/questions/3942888/unicodeencodeerror-latin-1-codec-cant-encode-character) –

Respuesta

12

Si necesita América-1 de codificación, tiene varias opciones para deshacerse de los otros puntos de código en el tablero, o por encima de 255 (caracteres no incluidos en 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' 

O hacer su propios reemplazos personalizados:

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

Si usted no está obligado a la salida Latin-1, a continuación, UTF-8 es una opción común y preferido. Es recomendado por el W3C y bien codifica todos los puntos de código Unicode:

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

El carácter unicode u '\ 02013' es el "en dash". Está contenido en el juego de caracteres de Windows-1252 (cp1252) (con la codificación x96), pero no en el juego de caracteres Latin-1 (iso-8859-1). El juego de caracteres de Windows-1252 tiene algunos más caracteres definidos en el son x80 - x9f, entre ellos el en dash.

La solución sería elegir un conjunto de caracteres de destino diferente a Latin-1, como Windows-1252 o UTF-8, o reemplazar el en-tablero con un simple "-".

Cuestiones relacionadas