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.



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.


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')

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

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 = "ボールト"

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")

10
city = 'Ribeir\xc3\xa3o Preto'
print city.decode('cp1252').encode('utf-8')

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

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')
ñ

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.