2010-04-21 18 views
5

¿Alguien sabe por qué las funciones de conversión de cadenas arrojan excepciones cuando se pasa errors = "ignore"? ¿Cómo puedo convertir objetos de cadenas normales de Python a Unicode sin generar errores? ¡Muchas gracias!excepciones con funciones de codificación/decodificación unicode de python (¿por qué no se ignoran los errores =)

python -c "import codecs; codecs.open('tmp', 'wb', encoding='utf8', errors='ignore').write('кошка')" 

vuelve
de trazas (llamada más reciente pasado):
de archivos "", línea 1, en
Archivo "/usr/lib/python2.6/codecs.py", línea 686, en
escribir retorno self.writer.write (datos)
archivo "/usr/lib/python2.6/codecs.py", línea 351, en la escritura de datos,
consumido = self.encode (objeto, self.errors)
UnicodeDecodeError: el códec 'ascii' no puede decodificar el byte 0xd0 en la posición 0: ordinal no en el rango (128)

EDIT - gracias por las respuestas, pero ¿alguien sabe cómo convertir el literal anterior, sin usar el prefijo "u"? La razón es que, por supuesto, podría tratar con algo que no era una constante :)

Respuesta

2

En el uso de Python 2.x escritura (' кошка'.decode ('UTF-8') en lugar deescritura ('кошка').

puede usar otra codificación demasiado en lugar de 'UTF-8'.

Esperemos que no arroje ningún error ...

3

El método write (en Python 2) toma un objeto Unicode, y lo está pasando un str - por lo que la llamada encode en codecs.py línea 351 está intentando primero construir un objeto Unicode (con el códec predeterminado, 'ascii'). Fix es fácil: cambiar la llamada a write

write(u'кошка') 

El prefijo u le dice a Python que estés utilizando un objeto Unicode, y debe estar bien.

+0

Esta es la mejor respuesta. Proporciona compatibilidad con versiones anteriores de Python 3. – Alan

1

problema está aquí === >>>> escritura ('кошка')

Estás escribiendo un objeto str, el receptor está esperando un objeto Unicode, por lo que intenta convertir a Unicode mediante el valor por defecto codificación (ASCII), que por supuesto (?) produce el conocido (?) UnicodeDecodeError: 'ascii' codec can't decode byte 0xXX in position 0: ordinal not in range(128)

el punto entero de utilizar el módulo de códecs como que se va a conseguir que convertir su unicode objetos a UTF-8 codificados en la mosca - así que alimentarlo unicode

actualización Cómo convertir el literal o no literal:

unicode_object = literal_or_whatever.decode ("UNKNOWN_ENCODING")

¿Sabe cómo su literal está codificado? ¿Te gustaría decirnos qué estás tratando de lograr? A un trazador de líneas con python -c no es de mucha ayuda ;-)

+0

la función Unicode() no funciona, arroja la misma excepción. – gatoatigrado

+0

@gatoatigrado: Dije que lo alimentara unicode; No dije usar la función 'unicode()'. Si usa 'unicode()' sin especificar una codificación, POR SUPUESTO obtendrá la misma excepción (la codificación predeterminada es ascii). Y por favor lea la última oración de mi respuesta. –

+0

ah, lo siento, estaba escaneando, lo siento. La pregunta era "cómo" lo realizo unicode desde una cadena de Python. La forma lógica sería 'unicode (pystr)', pero eso no funciona. Creo que he usado tontos trucos con bytes() antes, pero me gustaría saber cuál es la verdadera solución. – gatoatigrado

2

un no-solución (de la pregunta autor) Me acabo de enterar: uso python3

python3 -c "import codecs; codecs.open('tmp', 'wb', encoding='utf8', errors='ignore').write('кошка')" 
+0

Sí, Python 3 tiene soporte Unicode nativo. =] –

Cuestiones relacionadas