Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: $francisco en Agosto 21, 2017, 04:26:32 PM

Título: [SOLUCIONADO] Python. Descodificar cualquier caracter
Publicado por: $francisco en Agosto 21, 2017, 04:26:32 PM
Que tal compañeros, tengo un problema con los caracteres a la hora de descodificarlos, resulta que la cadena de texto la cojo de internet con pytube para descargar el video de youtube, el titulo es el problema, en la mayoria de los casos no pasa nada pero en otros me lanza el un error como este UnicodeEncodeError: 'charmap' codec can't encode character u'\u2666' in position 14: character maps to <undefined>
tubeturbo returned -1
para este problema estoy usando

Código (python) [Seleccionar]
cadena.decode('cp1252')
y funciona a excepción de algunos caracteres como por ejemplo con este titulo
Hardcore 2017 ♦ Dominator Festival 2017 ♦ Warm-Up Mix ♦ Festival Video ♦ Air Force Festival 2017
¿como puedo solucionar esto y que no me de ningun problema?

Título: Re:[python] Descodificar cualquier caracter
Publicado por: grep en Agosto 22, 2017, 11:53:03 AM
Existen buenas respuestas en StackOverflow:
https://stackoverflow.com/questions/14630288/unicodeencodeerror-charmap-codec-cant-encode-character-maps-to-undefined

Puedes manejar la excepción reemplazando los caracteres desconocidos por el codec (encoding error) con un caracter predeterminado como se documenta aquí:
https://docs.python.org/3/library/stdtypes.html#bytes.decode
https://docs.python.org/3/library/codecs.html#codecs.register_error
https://docs.python.org/3/library/codecs.html#codecs.replace_errors
https://docs.python.org/3/howto/unicode.html#the-string-type


Código (python) [Seleccionar]

cadena.decode("cp1252", "replace")


NOTA: pytube usa utf-8 (https://docs.python.org/3/library/codecs.html#standard-encodings) para manejar los strings con contenido HTML y JSON.

Saludos
Título: Re:[python] Descodificar cualquier caracter
Publicado por: $francisco en Agosto 22, 2017, 05:58:57 PM
Ya lo intente todo aqui muestro el codigo original
Código (python) [Seleccionar]
filename = video.filename.encode('cp1252')
donde este no funciona y lo cambié a
Código (python) [Seleccionar]
filename = video.filename.encode('utf8')
que funciona pero me muestra otros simbolos que no son los originales y con
Código (python) [Seleccionar]
filename = video.filename.encode('cp1252','replace')
no funciona el script termina sin ninguna excepcion
Título: Re:[python] Descodificar cualquier caracter
Publicado por: grep en Agosto 23, 2017, 01:17:45 AM
La interfaz con los caracteres Unicode es el problema cuando corres Python desde la consola de Windows.

Las versiones de Python anteriores a la 3.6 usan el console character encoding (chcp) de la consola de Windows (The codepage is often 8-bit encoding such as cp437 that can represent only ~0x100 characters from ~1M Unicode characters), sin embargo la consola si soporta los caracteres Unicode siempre y cuando una font adecuada sea configurada.

Puedes instalar el paquete win-unicode-console para que Python utilice la Unicode API de Windows:

Código (python) [Seleccionar]

pip install win-unicode-console


Antes de utilizar win-unicode-console:

Código (python) [Seleccionar]

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

from pytube import YouTube

# not necessary, just for demo purposes.
from pprint import pprint

yt = YouTube("https://www.youtube.com/watch?v=Qp2H-9iNTvE")
yt.get_videos()

print(yt.filename.encode('utf_8', 'replace'))
print(yt.filename)
print(yt.filename.decode('utf_8', 'replace'))

Código (text) [Seleccionar]

RESULTADO=
Hardcore 2017 ΓÖª Dominator Festival 2017 ΓÖª Warm-Up Mix ΓÖª Festival Video ΓÖª Air Force Festival 2017
Traceback (most recent call last):
  File "prueba.py", line 14, in <module>
    print(yt.filename)
  File "C:\Python27\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2666' in position 14: character maps to <undefined>


Utilizando win-unicode-console:

Código (python) [Seleccionar]

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

import win_unicode_console
win_unicode_console.enable()

from pytube import YouTube

# not necessary, just for demo purposes.
from pprint import pprint

yt = YouTube("https://www.youtube.com/watch?v=Qp2H-9iNTvE")
yt.get_videos()

print(yt.filename.encode('utf_8', 'replace'))
print(yt.filename)
print(yt.filename.decode('utf_8', 'replace'))

Código (text) [Seleccionar]

RESULTADO=
Hardcore 2017 ♦ Dominator Festival 2017 ♦ Warm-Up Mix ♦ Festival Video ♦ Air Force Festival 2017
Hardcore 2017 ♦ Dominator Festival 2017 ♦ Warm-Up Mix ♦ Festival Video ♦ Air Force Festival 2017
Hardcore 2017 ♦ Dominator Festival 2017 ♦ Warm-Up Mix ♦ Festival Video ♦ Air Force Festival 2017


fuente:
https://stackoverflow.com/questions/5419/python-unicode-and-the-windows-console
https://msdn.microsoft.com/en-us/library/windows/desktop/dd317752(v=vs.85).aspx

Saludos
Título: Re:[python] Descodificar cualquier caracter
Publicado por: $francisco en Agosto 23, 2017, 11:01:12 AM
Gracias me sirvio, ya puedo imprimir cualquier caracter, la verdad es que estos módulos hacen no tener muchos dolores de cabeza