Foros del Web » Programando para Internet » Python »

Problema Encoding

Estas en el tema de Problema Encoding en el foro de Python en Foros del Web. Buenas a todos. Los "sorprendo" nuevamente con el mismo problema. Esta vez se trata de lo siguiente: Una función retorna el siguiente valor: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); ...
  #1 (permalink)  
Antiguo 05/10/2012, 18:56
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 9 años, 5 meses
Puntos: 35
Problema Encoding

Buenas a todos. Los "sorprendo" nuevamente con el mismo problema. Esta vez se trata de lo siguiente: Una función retorna el siguiente valor:

Código Python:
Ver original
  1. c¾mo estßs?

En consecuencia tengo ese valor en una variable, y quisiera, logicamente, que el texto pudiera leerse de la manera correcta:

Código Python:
Ver original
  1. cómo estás?

Con el siguiente código:

Código Python:
Ver original
  1. print variable.encode("utf-8")

Retorna el siguiente error: UnicodeDecodeError: 'ascii' codec can't decode byte 0xbf in position 7: ordinal not in range (128)

Para aclarar, el encoding por defecto es ascii.

Espero que puedan ayudarme, gracias!

  #2 (permalink)  
Antiguo 05/10/2012, 19:04
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 16 años, 3 meses
Puntos: 1360
Respuesta: Problema Encoding

Necesitas la declaración de #encoding al principio.

Código Python:
Ver original
  1. # -*- coding: utf-8 -*-
  2.  
  3. string_as_bytes = "\xc2\xbfC\xc3\xb3mo estas?"
  4. string_as_unicode = string_as_bytes.decode('utf-8')
  5.  
  6. print "String as bytes"
  7. print repr(string_as_bytes)
  8. print
  9.  
  10. print "String as unicode"
  11. print repr(string_as_unicode)
  12. print
  13.  
  14. print "String as bytes"
  15. print string_as_bytes
  16. print
  17.  
  18. print "String as unicode"
  19. print string_as_unicode

Obviamente UTF-8 tiene que estar soportado por tu shell.
  #3 (permalink)  
Antiguo 05/10/2012, 19:59
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 9 años, 5 meses
Puntos: 35
Respuesta: Problema Encoding

La línea # -*- coding: utf-8 -*- ya está, pero al hacer variable.decode("utf-8") (que es la que contiene el valor c¾mo estßs?), arroja este error:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xbf in position 7: invalid start byte

Creo que primero debería convertir c¾mo estßs a "\xc2\xbfC\xc3\xb3mo estas?", verdad?

  #4 (permalink)  
Antiguo 05/10/2012, 21:01
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 16 años, 3 meses
Puntos: 1360
Respuesta: Problema Encoding

Lo que pasa es que "cómo estás" esta en alguna codificación y al momento de mostrarlo o imprimirlo lo haces en otra codificación completamente diferente.

¿En que codificación esta tu archivo?
¿En que codificación esta la cadena?
¿En que codificación esta imprimiendo en la consola?
  #5 (permalink)  
Antiguo 06/10/2012, 08:21
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 9 años, 5 meses
Puntos: 35
Respuesta: Problema Encoding

El archivo está en UTF-8:

Código Python:
Ver original
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-

Los otros dos como puedo averiguarlo?
El sys.getdefaultencoding() devuelve "ascii"

Gracias
  #6 (permalink)  
Antiguo 06/10/2012, 09:21
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 16 años, 3 meses
Puntos: 1360
Respuesta: Problema Encoding

No, la declaración de tu encoding dice que esta en utf-8. Pero solo el editor de texto que usas puede decirte que encoding estas usando para guardar el archivo.

La codificación de tu cadena voy asumir que es la misma que la tu archivo.

Y de la consola depende de que consola estés usando.
  #7 (permalink)  
Antiguo 06/10/2012, 10:51
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 9 años, 5 meses
Puntos: 35
Respuesta: Problema Encoding

Ah, sí, estoy usando Geany y dice que es UTF-8. La consola es la de windows. No se que otro dato puedo darte...
  #8 (permalink)  
Antiguo 06/10/2012, 11:01
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 16 años, 3 meses
Puntos: 1360
Respuesta: Problema Encoding

El comando chcp te muestra en encoding que esta usando la consola de windows.

Otra cosa es que la consola de windows no soporta utf-8 tienes que usar otro consola para que los caracteres se vean bien o cambiar el encoding por probablemente latin-1 que es el encoding que usa windows en español.
  #9 (permalink)  
Antiguo 06/10/2012, 11:10
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 9 años, 5 meses
Puntos: 35
Respuesta: Problema Encoding

Acabo de probar .decode("latin-1") y funciona perfectamente. Gracias!
Aún tengo una duda: aunque la consola de windows no soporte UTF-8, si yo no imprimo ningún texto, solamente hago el .decode("utf-8"), no debería permitirmelo?

Gracias nuevamente!
  #10 (permalink)  
Antiguo 06/10/2012, 11:27
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 16 años, 3 meses
Puntos: 1360
Respuesta: Problema Encoding

Si te lo permite. De hecho puedes hacer decoding de cualquier string siempre y cuando sea una secuencia valida de bytes en la codificación que hayas escogido.

Si estas usando windows y la consola de windows entonces puedes usar latin-1 como codificación en tu archivo para que puedas hacer como print "cómo estás" sin problemas.
  #11 (permalink)  
Antiguo 06/10/2012, 13:06
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 9 años, 5 meses
Puntos: 35
Respuesta: Problema Encoding

Gracias

Etiquetas: decode, encoding, gui
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:35.