Cómo convertir una cadena a utf-8 en Python


Tengo un navegador que envía caracteres utf-8 a mi servidor Python, pero cuando lo recupero de la cadena de consulta, la codificación que Python devuelve es ASCII. ¿Cómo puedo convertir la cadena simple a utf-8?

NOTA: La cadena pasada desde la web ya está codificada en UTF-8, solo quiero hacer que Python la trate como UTF-8 y no como ASCII.

Author: Batman, 2010-11-15

8 answers

>>> plain_string = "Hi!"
>>> unicode_string = u"Hi!"
>>> type(plain_string), type(unicode_string)
(<type 'str'>, <type 'unicode'>)

^ Esta es la diferencia entre una cadena de bytes (plain_string) y una cadena unicode.

>>> s = "Hello!"
>>> u = unicode(s, "utf-8")

^ Convertir a unicode y especificar la codificación.

 219
Author: user225312,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-15 08:31:41

Si los métodos anteriores no funcionan, también puede decirle a Python que ignore partes de una cadena que no puede convertir a utf-8:

stringnamehere.decode('utf-8', 'ignore')
 59
Author: duhaime,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-07 17:00:57

Puede ser un poco exagerado, pero cuando trabajo con ascii y unicode en los mismos archivos, repetir la decodificación puede ser un dolor, esto es lo que uso:

def make_unicode(input):
    if type(input) != unicode:
        input =  input.decode('utf-8')
        return input
    else:
        return input
 16
Author: Blueswannabe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-29 19:13:33

Si lo entiendo correctamente, tiene una cadena de bytes codificada en utf-8 en su código.

La conversión de una cadena de bytes a una cadena unicode se conoce como decodificación (unicode- > byte-string es codificación).

Lo hace usando la función unicode o el método decode. O bien:

unicodestr = unicode(bytestr, encoding)
unicodestr = unicode(bytestr, "utf-8")

O:

unicodestr = bytestr.decode(encoding)
unicodestr = bytestr.decode("utf-8")
 12
Author: codeape,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-15 08:55:26

Agregar la siguiente línea a la parte superior de su .py archivo:

# -*- coding: utf-8 -*-

Te permite codificar cadenas directamente en tu script, así:

utfstr = "ボールト"
 11
Author: Ken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-25 05:17:58
city = 'Ribeir\xc3\xa3o Preto'
print city.decode('cp1252').encode('utf-8')
 7
Author: Willem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-26 20:31:44

En Python 3.6, no tienen una función unicode() incorporada. Para convertir una cadena a unicode, simplemente obtenga el valor unicode del carácter y haga esto:

my_str = "\u221a25"
my_str = u"{}".format(my_str)
print(my_str)
>>> √25
 6
Author: Zld Productions,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-20 15:53:45

Traducir con ord() y unichar(). Cada carácter unicode tiene un número asociado, algo así como un índice. Así que Python tiene algunos métodos para traducir entre un char y su número. La desventaja es un ejemplo ñ. Espero que pueda ayudar.

>>> C = 'ñ'
>>> U = C.decode('utf8')
>>> U
u'\xf1'
>>> ord(U)
241
>>> unichr(241)
u'\xf1'
>>> print unichr(241).encode('utf8')
ñ
 1
Author: Joe9008,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-09 17:24:57