Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: dimineko en 19 Julio 2019, 21:12 pm



Título: [PYTHON] Imprimir carácteres Unicode
Publicado por: dimineko en 19 Julio 2019, 21:12 pm
Hola! Estaba haciendo un script que no tiene que ver con esto,cuando decidí imprimir el símbolo "✓".
Al principio me me imprimia algo parecido a esto: "[?]" pero me lo esperaba ya que es un carácter unicode.
El problema es que tras mirar en mucho stackoverflow y parecidos, no consigo solucionarlo.Ya
Además de no poder imprimir simbolos unicode,no puedo imprimir eñes ni parecido.Esta es la salida del script(el cual va bien).

Además es curioso porque la consola imprime [?] pero si lo copio y pego por ejemplo en este mensaje aparece como ✓.

Este es el código aunque todo va bien, solo es lo de imprimir.
Código
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. print('\u2713') #ESTO LO IMPRIME COMO [?] AUNQUE AL COPIARLO AQUÍ SE VE EL TICK
  4. print('\u0420\u043e\u0441\u0441\u0438\u044f')  #ESTO LO IMPRIME BIEN (Era por probar)
  5.  
  6. f = open("data.txt","r")
  7. for line in f:
  8. campo = line.split(":")
  9. usuario = campo[0]
  10. contraseña = campo[1]
  11. print ("Usuario: ",usuario,"\tContraseña ",contraseña)  #Las eñes y los acentos los imprime mal.
  12.  


Esta es la salida(pongo imágen porque al copiarlo y pegarlo aquí se corrige,es decir,es en mi consola el error al parecer).
(http://i67.tinypic.com/2s0ijd2.png)


Título: Re: [PYTHON] Imprimir carácteres Unicode
Publicado por: WHK en 19 Julio 2019, 22:02 pm
Hola, eso sucede porque en python los bytes unicode no se tratan de la misma manera que un string, los strings deben tener una codificación de caracteres definida que por lo general debe ser utf8 y no todos los caracteres de utf8 son compatibles o visibles.

Lo que debes hacer es tratar la cadena de texto como un array de bytes, por ejemplo:

Código:
b'contenido acá'

Eso es un arreglo de bytes y no un string, por lo cual ya no te dará problemas en la codificación de caracteres, luego si lo quieres mostrar en pantalla debes utilizar la función decode() junto a la codificación de caracteres que quieres utilizar.

Probablemente el valor unicode de tu check no corresponde al valor visible en utf8 o talves tu consola de comandos no está funcionando en utf8, generalmente estos errores suceden en windows, en linux jamás tendrás este tipo de problemas ya que el bash carga por defecto utf8, en cambio windows carga por defecto latin iso.

Si usas windows debes intentar modificar tu consola de comandos para que funcione bajo utf8 o escribir el valor unicode del check pero en latin iso.

Según https://graphemica.com/%E2%9C%93 ese caracter con ese mismo valor en bytes es un check pero en utf8 solamente, en latin iso tiene otro valor (lo mismo sucede con la eñe).

Saludos.