[SOLUCIONADO] Python. Descodificar cualquier caracter

Iniciado por $francisco, Agosto 21, 2017, 04:26:32 PM

Tema anterior - Siguiente tema

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

Agosto 21, 2017, 04:26:32 PM Ultima modificación: Agosto 23, 2017, 11:50:56 AM por Gabriela
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
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?


Agosto 22, 2017, 11:53:03 AM #1 Ultima modificación: Agosto 22, 2017, 09:50:14 PM por xyz
Existen buenas respuestas en StackOverflow:
Código: php
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í:
Código: php
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

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


NOTA: pytube usa No tienes permitido ver los links. Registrarse o Entrar a mi cuenta para manejar los strings con contenido HTML y JSON.

Saludos

Ya lo intente todo aqui muestro el codigo original
Código: python
filename = video.filename.encode('cp1252')

donde este no funciona y lo cambié a
Código: python
filename = video.filename.encode('utf8')

que funciona pero me muestra otros simbolos que no son los originales y con
Código: python
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:

Código: python

pip install win-unicode-console


Antes de utilizar win-unicode-console:

Código: python

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

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

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

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:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Saludos

Gracias me sirvio, ya puedo imprimir cualquier caracter, la verdad es que estos módulos hacen no tener muchos dolores de cabeza