2011-03-26 22 views
8
Python 3.2 (r32:88445, Feb 20 2011, 21:29:02) [MSC v.1500 32 bit (Intel)] on win32 
Type "copyright", "credits" or "license()" for more information. 
>>> str_version = 'នយោបាយ' 
>>> type(str_version) 
<class 'str'> 
>>> print (str_version) 
នយោបាយ 
>>> unicode_version = 'នយោបាយ'.decode('utf-8') 
Traceback (most recent call last): 
    File "<pyshell#3>", line 1, in <module> 
    unicode_version = 'នយោបាយ'.decode('utf-8') 
AttributeError: 'str' object has no attribute 'decode' 
>>> 

¿Cuál es el problema con mi cadena Unicode?Cadena en python con mi Unicode?

Respuesta

10

¡No hay nada de malo con su cadena! Usted acaba de confundir encode() y decode(). La cadena es símbolos significativos. Para convertirlo en bytes que pueden almacenarse en un archivo o transmitirse a través de Internet, use encode() con una codificación como UTF-8. Cada codificación es un esquema para convertir símbolos significativos en bytes planos de salida.

Cuando llegue el momento de hacer lo contrario - que tomar algunos bytes sin formato de un archivo o un socket y convertirlos en símbolos, como letras y números - se decodificación los bytes utilizando el método de cadenas de bytes decode() en Python 3

>>> str_version = 'នយោបាយ' 
>>> str_version.encode('utf-8') 
b'\xe1\x9e\x93\xe1\x9e\x99\xe1\x9f\x84\xe1\x9e\x94\xe1\x9e\xb6\xe1\x9e\x99' 

¿Ves esa gran línea larga de bytes? Esos son los bytes que utiliza UTF-8 para representar su cadena, si necesita transmitir la cadena a través de una red, o almacenarlos en un documento. Hay muchas otras codificaciones en uso, pero parece ser la más popular. Cada codificación puede convertir símbolos significativos como ន y យោ en bytes, los pequeños números de 8 bits con los que se comunican las computadoras.

>>> rawbytes = str_version.encode('utf-8') 
>>> rawbytes 
b'\xe1\x9e\x93\xe1\x9e\x99\xe1\x9f\x84\xe1\x9e\x94\xe1\x9e\xb6\xe1\x9e\x99' 
>>> rawbytes.decode('utf-8') 
'នយោបាយ' 
+0

todavía no está limpio. ¿Podría explicarlo más claramente? gracias Brandon Craig Rhodes – kn3l

+0

He agregado otro párrafo y algunas muestras de código. ¿Lo hacen más claro? –

+0

Ahora está claro. Entiendo ahora por su ejemplo, muchas gracias @Brandon Craig Rhodes – kn3l

7

Estás leyendo los documentos de 2.x. str.decode() (y bytes.encode()) se soltó en 3.x. Y str ya es una cadena Unicode; no hay necesidad de decodificarlo.

3

Ya tiene una cadena Unicode. En Python 3, str son cadenas unicode (unicode en Python 2.x), y las cadenas de un solo byte (Python 2.x str) ya no se tratan como texto, ahora se llaman bytes. Este último se puede convertir en str con su método decode, pero el primero ya está decodificado; solo puede codificar en bytes.

Cuestiones relacionadas