Bueno, déjame presentarte el problema primero.

Tengo algunos datos a través de solicitudes POST / GET. Los datos eran cadenas codificadas en UTF-8. Poco sabía yo de eso, y lo convertí solo con el método str(). Y ahora tengo una base de datos completa de "datos sin sentido" y no pude encontrar el camino de regreso.

Código de ejemplo:

unicode_str : esta es la cadena que debería obtener

encoded_str : esta es la cadena que recibí con las solicitudes POST / GET, datos iniciales

bad_str : los datos que tengo en la base de datos en este momento y de los que necesito obtener unicode.

Entonces, aparentemente, sé cómo convertir: unicode_str = (encode) => encoded_str = (str) => bad_str

Pero no pude encontrar una solución: bad_str = (???) => encoded_str = (decode) => unicode_str

In [1]: unicode_str = 'Příliš žluťoučký kůň úpěl ďábelské ódy'

In [2]: unicode_str
Out[2]: 'Příliš žluťoučký kůň úpěl ďábelské ódy'

In [3]: encoded_str = unicode_str.encode("UTF-8")

In [4]: encoded_str
Out[4]: b'P\xc5\x99\xc3\xadli\xc5\xa1 \xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd k\xc5\xaf\xc5\x88 \xc3\xbap\xc4\x9bl \xc4\x8f\xc3\xa1belsk\xc3\xa9 \xc3\xb3dy'

In [5]: bad_str = str(encoded_str)

In [6]: bad_str
Out[6]: "b'P\\xc5\\x99\\xc3\\xadli\\xc5\\xa1 \\xc5\\xbelu\\xc5\\xa5ou\\xc4\\x8dk\\xc3\\xbd k\\xc5\\xaf\\xc5\\x88 \\xc3\\xbap\\xc4\\x9bl \\xc4\\x8f\\xc3\\xa1belsk\\xc3\\xa9 \\xc3\\xb3dy'"

In [7]: new_encoded_str = some_magical_function_here(bad_str) ???
12
darkless 16 nov. 2017 a las 15:26

2 respuestas

La mejor respuesta

Convirtió un objeto de bytes en una cadena, que es solo una representación del objeto de bytes. Puede obtener el objeto bytes original utilizando ast.literal_eval() (créditos a Mark Tolonen por la sugerencia), entonces un simple decode() hará el trabajo.

>>> import ast
>>> ast.literal_eval(bad_str).decode('utf-8')
'Příliš žluťoučký kůň úpěl ďábelské ódy'

Ya que fue usted quien generó las cadenas, usar eval() sería seguro, pero ¿por qué no hacerlo?

12
Reti43 16 nov. 2017 a las 18:39

No utilice eval, en su lugar:

import codecs
s = 'žluťoučký'
x = str(s.encode('utf-8'))

# strip quotes
x = x[2:-1]

# unescape
x = codecs.escape_decode(x)[0].decode('utf-8')

# profit
x == s
4
Honza Král 17 nov. 2017 a las 14:03