2010-11-15 34 views
118

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 devuelve Python es ASCII. ¿Cómo puedo convertir la cadena simple a utf-8?Cómo convertir una cadena a utf-8 en Python

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

+0

tratar este enlace [http://evanjones.ca/python-utf8.html](http://evanjones.ca/python-utf8.html) – Mudassir

+0

creo que un título mejor sería ** ¿Cómo forzar una cadena a unicode sin traducción?** – boatcoder

Respuesta

184
>>> 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 de Unicode.

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

^Convertir a unicode y especificar la codificación.

+25

, estoy consiguiendo el error siguiente: ' UnicodeDecodeError: códec 'utf8' no puede decodificar 0xB0 byte en la posición 2: inicio inválida byte' Este es mi código: ret = [] de línea en CSVReader : Cline = [] para olmo en línea: unicodestr = Unicode (olmo, 'utf-8') cline.append (unicodestr) ret.append (Cline) –

+29

Nada de esto se aplica en Python 3, todas las cadenas son unicode y 'unicode()' no existe. – Noumenon

+0

Tipo de golpes esto, pero gracias. Esto solucionó un problema por el que intentaba imprimir unicode y obtenía s. –

10

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

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

Lo hace utilizando 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") 
50

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

stringnamehere.decode('utf-8', 'ignore') 
+4

Uff, gracias mucho, esta paz de código finalmente terminó mi problema de minidom! – Alex

+15

* paz de código * .... no estoy seguro si error ... – user1717828

11

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

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

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

utfstr = "ボールト" 
+1

No es lo que OP pregunta. Pero evite esos literales de cadena de todos modos. Crea cadena Unicode en Python 3 (bien) pero es una cadena de bytes en Python 2 (mala). Agregue 'from __future__ import unicode_literals' en la parte superior o use' u''' prefix. No use caracteres que no sean ascii en los literales 'bytes'. Para obtener bytes utf-8, podría 'utf8bytes = unicode_text.encode ('utf-8')' más tarde si es necesario. – jfs

15

podría ser un poco exagerado, pero cuando trabajo con ASCII y Unicode en mismos archivos, repitiendo decodificación puede ser un dolor, esto es lo Yo uso:

def make_unicode(input): 
    if type(input) != unicode: 
     input = input.decode('utf-8') 
     return input 
    else: 
     return input 
3

En Python 3.6, no tienen incorporada la función unicode(). para convertir una cadena a Unicode, sólo tiene que obtener el valor Unicode del carácter, y hacer esto:

my_str = "\u221a25" 
my_str = u"{}".format(my_str) 
print(my_str) 
>>> √25 
5
city = 'Ribeir\xc3\xa3o Preto' 
print city.decode('cp1252').encode('utf-8') 
+0

Después de horas tratando de leer un archivo con nombres de ciudades, esto finalmente funcionó. – Christian

1

Traducir con ord() y unichar(). Todos los caracteres Unicode tienen 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. Un inconveniente 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') 
ñ 
Cuestiones relacionadas