Después de pasar horas revisando cada publicación de stackoverflow relacionada con esto, me estoy tomando el pelo para resolver lo que debería ser algo muy simple ...

Tengo un archivo de texto con códigos Unicode (no caracteres, códigos), por ejemplo:

"Edward escribió \ u00c3 \ u00b3 la biografía \ u00c3 \ u00ada de su autor favorito"

Esta cadena debe mostrarse como:

"Edward escribió la biografía de su autor favorito"

Si cargo el archivo como lo hago normalmente, solo veré las cadenas Unicode cuando imprima el texto cargado:

import io
chars = io.open(fb_json_path, encoding='utf-8').read().strip()

Esto imprime: "Edward escribi \ u00c3 \ u00b3 la biograf \ u00c3 \ u00ada de su autor favorito". Es lo mismo si elimino el parámetro de codificación.

Supongo que necesito decirle a Python que interprete los códigos en la cadena y los muestre como caracteres utf-8, pero no entiendo cómo hacerlo.

¡Gracias de antemano!

0
Eduardo G.R. 2 may. 2020 a las 20:24

2 respuestas

Creo que la entrada está de alguna manera confusa por una codificación incorrecta.

C3 93 son los bytes de codificación UTF-8 para ó (LETRA DE CAPITAL LATINO O CON AGUDA).

Ejecutar en la consola Python 3

>>> text = "Edward escribi\u00c3\u00b3 la biograf\u00c3\u00ada de su autor favorito"
>>> text.encode('cp1252').decode('utf8')
'Edward escribió la biografía de su autor favorito'
0
SubOptimal 2 may. 2020 a las 17:42

La podemos hacer en dos pasos:

Primero, leemos el archivo con encoding='unicode_escape' para convertir todos los \uxxxx.

Luego, convertimos esto a utf-8 codificándolo de manera transparente a un objeto de bytes (con códec latin-1) y lo convertimos a texto nuevamente, decodificando como utf-8

with open('text.txt', encoding='unicode-escape') as f:
    text = f.read()
    print(text)
    #Edward escribió la biografía de su autor favorito

    # Now we convert it to utf-8
    text = text.encode('latin1').decode('utf8')
    print(text)
    # Edward escribió la biografía de su autor favorito
0
Thierry Lathuille 2 may. 2020 a las 17:43