2012-07-21 9 views
8

Intenté entender por mi cuenta encode y decode en Python, pero no hay nada realmente claro para mí.No entiendo codificar y descodificar en Python (2.7.3)

  1. str.encode([encoding,[errors]])
  2. str.decode([encoding,[errors]])

En primer lugar, no entiendo la necesidad del parámetro "codificación" en estas dos funciones.

¿Cuál es la salida de cada función, su codificación? ¿Cuál es el uso del parámetro "codificación" en cada función? Realmente no entiendo la definición de "cadena de bytes".

Tengo una pregunta importante, ¿hay alguna manera de pasar de una codificación a otra? He leído algo de texto en ASN.1 sobre "cadena de octetos", así que me pregunto si es lo mismo que "cadena de bytes".

Gracias por su ayuda.

+4

Pero leyó los [documentos] (http://docs.python.org/library/stdtypes.html#str.encode), ¿verdad? Lo siento, estoy preguntando – tiwo

Respuesta

19

Es un poco más complejo en Python 2 (en comparación con Python 3), ya que combina los conceptos de 'cadena' y 'longitud de cadena' bastante, pero vea The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets. Básicamente, lo que necesita comprender es que 'cadena' y 'carácter' son conceptos abstractos que no pueden ser representados directamente por una computadora. Una cadena de bytes es una secuencia sin formato de bytes directamente desde el disco (o que se puede escribir directamente desde el disco). encode va de abstracto a concreto (le da preferiblemente una cadena Unicode, y le devuelve una cadena de bytes); decode va en la dirección opuesta.

La codificación es la regla que dice que 'a' debe estar representado por el byte 0x61 y 'α' por la secuencia de dos bytes 0xc0\xb1.

+0

si lo entiendo, una cadena no tiene realmente sentido del intérprete, no puede ser intercambio entre máquinas así que cuando escribo str.encoding ("ascii"), str se vuelve real, se codifica de acuerdo con las especificaciones de ascii en ese ejemplo en la memoria y su valor de codificación es el mismo que define por ascii y esta codificación se denomina "cadena de bytes": ¿es correcto? –

+0

¿puede un byte en una cadena de "bytes" soportar una adición? –

+1

@NarcisseDoudieuSiewe para la primera pregunta, sí, es correcto, aunque su terminología es un poco confusa: la "codificación" es ASCII, no la cadena de bytes final, que podría llamarse "una cadena codificada en ascii", por ejemplo. Para la segunda pregunta, un elemento de una cadena de bytes es una cadena de bytes de un elemento (en Py2, una cadena de bytes es simplemente el tipo 'str', y una cadena es el tipo' unicode'), entonces 'b [0] + b [0] 'hace concatenación. Esto es diferente en Py3, donde un elemento de una cadena de bytes es en realidad un 'int' y por lo tanto,' b [0] + b [0] 'también es una adición int. – lvc

4

Sí, una cadena de bytes es una cadena de octetos. La codificación y la decodificación se producen al ingresar/enviar texto (desde/hacia la consola, archivos, la red, ...). Su consola puede usar UTF-8 internamente, su servidor web sirve latin-1, y ciertos formatos de archivos necesitan codificaciones extrañas como los acentos de Bibtex: fran\c{c}aise. Necesita convertir desde/hacia ellos en entrada/salida.

Los métodos {en|de}code hacen esto. A menudo se llaman detrás de la escena (por ejemplo, print "hello world" codifica la cadena para lo que sea que use su terminal).

6

Python 2.x tiene dos tipos de cadenas:

  • str = "cadenas de bytes" = una secuencia de octetos. Se utilizan tanto para codificaciones de caracteres "heredadas" (como windows-1252 o IBM437) como para datos binarios en bruto (como struct.pack de salida).
  • unicode = "Unicode strings" = una secuencia de UTF-16 o UTF-32 según cómo se construya Python.

Este modelo era changed for Python 3.x:

  • 2.x unicode se convirtió 3.x str (y el u prefijo fue eliminado de los literales).
  • Se introdujo un tipo bytes para representar datos binarios.

A character encoding es una asignación entre cadenas Unicode y cadenas de bytes. Para convertir una cadena Unicode, a una cadena de bytes, utilice el encode método:

>>> u'\u20AC'.encode('UTF-8') 
'\xe2\x82\xac' 

para convertir a la inversa, utilice el decode método:

>>> '\xE2\x82\xAC'.decode('UTF-8') 
u'\u20ac' 
14

Mi presentación de PyCon, Pragmatic Unicode, or, How Do I Stop The Pain cubre todos estos detalles

En pocas palabras, las cadenas Unicode son secuencias de enteros llamados puntos de código, y las cadenas de bytes son secuencias de bytes. Una codificación es una forma de representar puntos de código Unicode como una serie de bytes. Entonces unicode_string.encode(enc) devolverá la cadena de bytes de la cadena Unicode codificada con "enc", y byte_string.decode(enc) devolverá la cadena Unicode creada decodificando la cadena de bytes con "enc".

+0

Este artículo es tan bueno. Tuve que marcarlo para leerlo varias veces. ¡GRACIAS! –