Pregunta

Esto es en Python 2.4. Aquí está mi situación. Saco una cadena desde una base de datos, y contiene una metafonía 'O' (\ xf6). En este punto, si funciono tipo (valor) devuelve str. entonces yo intento funcionar .decode ( 'UTF-8'), y me da un error (códec 'utf8' no puede decodificar bytes en la posición 1-4).

En realidad mi objetivo aquí es sólo para realizar con éxito el tipo (valor) de retorno Unicode. He encontrado un anterior pregunta que tenían alguna información útil, pero no parece el ejemplo de la respuesta escogido para funcionar para mí. ¿Hay algo que estoy haciendo mal aquí?

Aquí hay un código para reproducir:

Name = 'w\xc3\xb6rner'.decode('utf-8')
file.write('Name: %s - %s\n' %(Name, type(Name)))

En realidad nunca llegar a la declaración de escritura, porque falla en la primera declaración.

Gracias por su ayuda.

Editar

He verificado que el juego de caracteres UTF-8 es la base de datos. Así que en mi código para reproducir cambié '\ xf6' a '\ xc3 \ XB6', y el fracaso persiste. ¿Hay una diferencia entre 'UTF-8' y 'UTF-8'?

La punta sobre el uso de codecs para escribir a un archivo es muy útil (definitivamente lo usaré), pero en este escenario sólo escribo para un archivo de registro para fines de depuración.

¿Fue útil?

Solución

  

Así que en mi código para reproducir cambié '\ xf6' a '\ xc3 \ XB6', y el fracaso se sigue produciendo

No en la primera línea no es así:

>>> 'w\xc3\xb6rner'.decode('utf-8')
u'w\xf6rner'

La segunda línea de errores hacia fuera sin embargo:

>>> file.write('Name: %s - %s\n' %(Name, type(Name)))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 7: ordinal not in range(128)

que es totalmente lo que se espera, tratando de escribir caracteres no ASCII Unicode a un flujo de bytes. Si utiliza la sugerencia de una corriente códecs-envuelta de Jiri puede escribir directamente Unicode, de lo contrario tendrá que volver a codificar la cadena Unicode en bytes manualmente.

Mejor, para cortar troncos, sería simplemente para escupir un repr () de la variable. Entonces usted no tiene que preocuparse de caracteres Unicode estar allí, o saltos de línea u otros caracteres no deseados:

name= 'w\xc3\xb6rner'.decode('utf-8')
file.write('Name: %r\n' % name)

Name: u'w\xf6rner'

Otros consejos

Su cadena no es en la codificación UTF8. Si desea 'descifrar' cadena a Unicode, la cadena debe estar en la codificación especificada por el parámetro. He intentado esto y funciona perfectamente:

print 'w\xf6rner'.decode('cp1250')

Editar

Para escribir cadenas Unicode al archivo que puede utilizar módulo de códecs:

import codecs
f = codecs.open("yourfile.txt", "w", "utf8")
f.write( ... )

Es práctico para especificar la codificación de la entrada / salida y el uso de cadena 'unicode' a través de su código sin preocuparse de las diferentes codificaciones.

Es obvio que es de 1 byte de codificación. 'O' en UTF-8 es '\ xc3 \ XB6'.

La codificación podría ser:

  • ISO-8859-1
  • ISO-8859-2
  • ISO-8859-13
  • ISO-8859-15
  • Win-1250
  • Win-1252

Es necesario utilizar "ISO-8859-1":

Name = 'w\xf6rner'.decode('iso-8859-1')
file.write('Name: %s - %s\n' %(Name, type(Name)))

UTF-8 utiliza 2 bytes para escapar nada fuera de ascii, pero aquí es sólo 1 byte, por lo iso-8859-1 es probablemente correcta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top