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

193

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 que se pasa de la web ya está codificada en UTF-8, solo quiero hacer que Python lo trate como UTF-8 y no como ASCII.

Bin Chen
fuente
Pruebe este enlace http://evanjones.ca/python-utf8.html
Mudassir
Creo que un mejor título sería ¿Cómo obligar a una cadena a unicode sin traducción?
Boatcoder
1
En 2018, python 3 si obtiene un error de decodificación ascii do"some_string".encode('utf-8').decode('utf-8')
devssh

Respuestas:

266
>>> 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 (cadena simple) y una cadena unicode.

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

^ Convertir a unicode y especificar la codificación.

usuario225312
fuente
34
, UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byteObtengo el siguiente error: Este es mi código: ret = [] para la línea en csvReader: cline = [] para elm en línea: unicodestr = unicode (elm, 'utf-8') cline.append (unicodestr) ret .append (cline)
Gopakumar NG
102
Nada de esto se aplica en Python 3, todas las cadenas son unicode y unicode()no existen.
Noumenon
Algo así, pero gracias. Esto solucionó un problema en el que estaba tratando de imprimir Unicode y obtenía s.
智障 的 人
¿Cómo convertir de unuevo a un strformato (convertir de unuevo a s)?
Tanguy
3
Este código solo funcionará mientras el texto no contenga caracteres que no sean ascii; un simple carácter acentuado en la cadena hará que falle.
Haroldo_OK
71

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')
duhaime
fuente
66
Got AttributeError: el objeto 'str' no tiene atributo 'decode'
saran3h
2
@ saran3h parece que estás usando Python 3, en cuyo caso Python debería manejar los problemas de codificación por ti. ¿Has intentado leer tu documento sin especificar una codificación?
duhaime
Python por defecto selecciona la codificación del sistema. En Windows 10 es cp1252, que es diferente de utf-8. Perdí unas horas mientras usaba codecs.open () en py 3.8
Vishesh Mangla hace
21

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
Blueswannabe
fuente
15

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

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

le permite codificar cadenas directamente en su script, así:

utfstr = "ボールト"
Conocido
fuente
1
No es lo que OP pregunta. Pero evite tales literales de cadena de todos modos. Crea una cadena Unicode en Python 3 (buena) pero es una cadena de bytes en Python 2 (mala). Agregue from __future__ import unicode_literalsen la parte superior o use el u''prefijo. No use caracteres no ascii en bytesliterales. Para obtener bytes utf-8, puede utf8bytes = unicode_text.encode('utf-8')hacerlo más tarde si es necesario.
jfs
1
@jfs, ¿cómo me from __future__ import unicode_literalsayudará a convertir una cadena con caracteres no ascii a utf-8?
Ortal Turgeman
@OrtalTurgeman No estoy respondiendo la pregunta. Mira, es un comentario, no una respuesta. Mi comentario aborda el problema con el código en la respuesta. Intenta crear una cadena de bytes con caracteres no ascii en Python 2 (es un SyntaxError en Python 3; los literales de bytes lo prohíben).
jfs
13

Si te entiendo correctamente, tienes una cadena de bytes codificada utf-8 en tu código.

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

Lo hace utilizando la función unicode o el método de decodificación . Ya sea:

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

O:

unicodestr = bytestr.decode(encoding)
unicodestr = bytestr.decode("utf-8")
codeape
fuente
10
city = 'Ribeir\xc3\xa3o Preto'
print city.decode('cp1252').encode('utf-8')
Willem
fuente
8

En Python 3.6, no tienen un método unicode () incorporado. Las cadenas ya están almacenadas como unicode de forma predeterminada y no se requiere conversión. Ejemplo:

my_str = "\u221a25"
print(my_str)
>>> 25
Producciones Zld
fuente
3

Traduce con ord () y unichar (). Cada carácter unicode tiene un número asociado, algo así como un índice. Entonces Python tiene algunos métodos para traducir entre un personaje 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')
ñ
Joe9008
fuente