comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

[Python] Me hago un lio tremendo con encode y decode

  • 2 Respuestas
  • 1095 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado $francisco

  • *
  • Underc0der
  • Mensajes: 191
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
    • Email
  • Skype: hackloper
« en: Septiembre 18, 2015, 06:13:33 pm »
Qué tal a todos!

Como bien digo no logro entender para qué sirve realmente esto y agradecería que me lo explicaran, a poder ser con algún ejemplo porque no logro entender para qué codificarlo y descodificarlo.

Si es cierto que lo he visto en multitud de web como lo utilizan e incluso lo he utilizado con pyqt y en alguna otra ocasión pero... no lo logro comprender, por si os sirve de ayuda dejo un trozo de código que hice para que veáis mas o menos por que mi confusión.

Código: Python
  1. str(QtCore.QString(video+'.mp4').toUtf8()).decode('utf-8')

De esta manera logro que pueda imprimir correctamente el nombre de un vídeo que lleva acentuación pero no sé el por qué de tanta descodificacion para lograr esto.

« Última modificación: Septiembre 21, 2015, 09:54:15 am por Expermicid »

Desconectado WhiZ

  • *
  • Underc0der
  • Mensajes: 395
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #1 en: Diciembre 10, 2015, 07:01:03 pm »
Hola @No tienes permisos para ver links. Registrate o Entra con tu cuenta! Revolviendo un poco la sección de "Dudas y pedidos generales" me encontré con este post tuyo (no lo había visto en su momento jeje).

Sinceramente, desconocía esta técnica y, por ende, su intención. Luego de un pequeño análisis, llegué a la conclusión de que se utiliza, no para imprimir en pantalla caracteres especiales - ya que eso se puede hacer de forma directa con el método toUtf8 - sino para convertir el dato de QByteArray a unicode.

Para que se entienda bien, te explico paso por paso. Vamos a suponer que tenemos el siguiente código:
Código: Python
  1. # -*- coding:utf-8 -*-
  2. from PyQt4 import QtCore
  3.  
  4. texto = QtCore.QString(u'niño')
  5.  
  6. print texto

Como vemos, la variable texto almacena un dato de tipo No tienes permisos para ver links. Registrate o Entra con tu cuenta. Si queremos imprimir su contenido en pantalla - que es lo que hacemos en el código anterior -, lo único que veremos será el siguiente error:
Código: Text
  1. UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in position 2: ordinal not in range(128)

Para entender mejor qué significa este UnicodeEncodeError, podemos recurrir a No tienes permisos para ver links. Registrate o Entra con tu cuenta y a No tienes permisos para ver links. Registrate o Entra con tu cuenta.

La pregunta que nos hacemos a continuación es: ¿cómo lo resolvemos?. Para esto, QString nos aporta un método llamado No tienes permisos para ver links. Registrate o Entra con tu cuenta que nos facilita la tarea. El mismo nos crea un dato de tipo No tienes permisos para ver links. Registrate o Entra con tu cuenta que, tal y como se dice en la documentación, no es más que una representación en UTF-8 del contenido de QString. Con este nuevo objeto, ya somos capaces de imprimir los caracteres especiales sin problema.

El código que presento a continuación, es capaz de manejar el error e imprimir el texto en pantalla:
Código: Python
  1. # -*- coding:utf-8 -*-
  2. from PyQt4 import QtCore
  3.  
  4. texto = QtCore.QString(u'niño')
  5.  
  6. try:
  7.     print texto
  8. except UnicodeDecodeError:
  9.     print texto.toUtf8()

Bien. Con esto queda resuelto el tema de imprimir datos de tipo QString con caracteres especiales. Sin embargo, todavía no respondo a tu pregunta: ¿por qué transformar un dato de tipo QString a QByteArray, luego a str y, por último, a unicode? xD

Lo primero que tengo que pensar es que la intención no es, simplemente, imprimir un QString con caracteres especiales. Como acabamos de decir, no hace falta más que llamar al método toUtf8 para hacerlo. Entonces, lo siguiente que se me viene a la mente es que la idea es convertir el dato de QString a unicode. Suponiendo que ése es el objetivo, hagamos un análisis de la situación y averiguemos el porqué de esta técnica:
Código: Python
  1. # -*- coding:utf-8 -*-
  2. from PyQt4 import QtCore
  3.  
  4. texto = QtCore.QString(u'niño')
  5. u_texto = str(texto.toUtf8()).decode('utf-8')  # convertimos a unicode
  6.  
  7. print "Tipo:", type(u_texto)
  8. print "Texto:", u_texto

Al ejecutar el script, obtenemos la siguiente salida:
Código: Text
  1. Tipo: <type 'unicode'>
  2. Texto: niño

Ahora voy a probar algo más simple:
Código: Python
  1. # -*- coding:utf-8 -*-
  2. from PyQt4 import QtCore
  3.  
  4. texto = QtCore.QString(u'niño')
  5. u_texto = unicode(texto)  # convertimos a unicode
  6.  
  7. print "Tipo:", type(u_texto)
  8. print "Texto:", u_texto

Veamos qué pasa al ejecutarlo:
Código: Text
  1. Tipo: <type 'unicode'>
  2. Texto: niño

Conclusión: como dije al principio, aparentemente, la técnica no se utiliza para imprimir un dato de tipo QString que contenga caracteres especiales sino para convertirlo al tipo unicode. No obstante, existe una forma más sencilla que consiste en llamar a la función unicode y pasarle como argumento el dato tipo QString. Con esta información en nuestras manos, sólo se me ocurren dos cosas: es, simplemente, una alternativa más compleja para hacer la conversión ó, posiblemente, una técnica que, además de la hacer la conversión, nos otorga algunos beneficios que desconozco.

Bueno, esto es todo lo que se me ocurre luego de analizar todo por un rato. Si alguien tiene algo más que aportar, adelante ;)

Saludos!
WhiZ
« Última modificación: Diciembre 10, 2015, 07:05:25 pm por WhiZ »


Desconectado $francisco

  • *
  • Underc0der
  • Mensajes: 191
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
    • Email
  • Skype: hackloper
« Respuesta #2 en: Diciembre 11, 2015, 11:23:42 am »
Muchas gracias whiz por tu respuesta, seguro que me sirve, a veces esto de codificar y descodificar me da dolores de cabeza en algunas ocasiones y a veces dificil de comprender y esa linea de código no tiene nada en especial o veneficio simplemente logré hacerla aleatoriamente para que pyqt me aceptara la variable para poder ver un video y solamente así me la aceptaba aunque no probré de la segunda forma que pusiste, repito thank por tu respuesta  ;D

 

¿Te gustó el post? COMPARTILO!



[SOLUCIONADO] Correr paso a paso un Script de Python

Iniciado por Olger346

Respuestas: 2
Vistas: 682
Último mensaje Febrero 11, 2018, 10:36:44 am
por Olger346
[SOLUCIONADO] [Python] Error: "Expected an indented block"

Iniciado por Banfek

Respuestas: 3
Vistas: 1836
Último mensaje Abril 01, 2015, 05:58:13 pm
por Banfek
[SOLUCIONADO] ¿Algún curso, taller o libro sobre inteligencia artificial Python?

Iniciado por dolphin

Respuestas: 1
Vistas: 918
Último mensaje Septiembre 10, 2016, 03:39:20 pm
por blackdrake
[Python] ¿Alguna libreria para recuperar archivos eliminados de la papelera?

Iniciado por $francisco

Respuestas: 2
Vistas: 1451
Último mensaje Noviembre 05, 2018, 06:43:15 am
por alexcv
[SOLUCIONADO] Ayuda para comprender un poco Python, vengo de Java.

Iniciado por coke951

Respuestas: 3
Vistas: 1253
Último mensaje Enero 01, 2016, 06:16:24 pm
por coke951