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
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?
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
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
Ya lo intente todo aqui muestro el codigo original
filename = video.filename.encode('cp1252')
donde este no funciona y lo cambié a
filename = video.filename.encode('utf8')
que funciona pero me muestra otros simbolos que no son los originales y con
filename = video.filename.encode('cp1252','replace')
no funciona el script termina sin ninguna excepcion
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:
pip install win-unicode-console
Antes de utilizar win-unicode-console:
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'))
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:
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'))
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
Gracias me sirvio, ya puedo imprimir cualquier caracter, la verdad es que estos módulos hacen no tener muchos dolores de cabeza