Aquí hay un intento de explicación simple que solo se aplica a Python 3. Espero que viniendo de una persona laica, ayude a aclarar algo de confusión para los completamente no iniciados. Si hay imprecisiones técnicas, pls me perdona y no dude en señalarlo.
supongamos que crea una cadena usando Python 3 en la forma habitual:
stringobject = 'ant'
stringobject
habría una cadena Unicode.
Una cadena Unicode se compone de caracteres Unicode. En stringobject
arriba, los caracteres Unicode son las letras individuales, p. a, n, t
A cada carácter Unicode se le asigna un punto de código, que se puede expresar como una secuencia de dígitos hexadecimales (un dígito hexadecimal puede tomar 16 valores, que van de 0-9 y A-F). Por ejemplo, la letra 'a'
es equivalente a '\u0091'
, y 'hormiga' es equivalente a '\u0061\u006E\u0074'
.
Así se encuentra que si escribe,
stringobject = '\u0061\u006E\u0074'
stringobject
También obtendrá la salida 'ant'
.
Ahora, Unicode se convierte en bytes, en un proceso conocido como codificación. El proceso inverso de convertir bytes a unicode se conoce como decodificación.
¿Cómo se hace esto? Como cada dígito hexadecimal puede tomar 16 valores diferentes, se puede reflejar en una secuencia binaria de 4 bits (por ejemplo, el dígito hexadecimal 0 puede expresarse en binario como 0000, el dígito hexadecimal 1 puede expresarse como 0001, etc.). Si un carácter Unicode tiene un punto de código que consta de cuatro dígitos hexadecimales, necesitaría una secuencia binaria de 16 bits para codificarlo.
Los diferentes sistemas de codificación especifican reglas diferentes para convertir unicode en bits. Lo que es más importante, las codificaciones difieren en la cantidad de bits que utilizan para expresar cada carácter Unicode.
Por ejemplo, el sistema de codificación ASCII utiliza solo 8 bits (1 byte) por carácter. Por lo tanto, solo puede codificar caracteres Unicode con puntos de código de hasta dos dígitos hexadecimales (es decir, 256 caracteres Unicode diferentes). El sistema de codificación UTF-8 utiliza 8 a 32 bits (1 a 4 bytes) por carácter, por lo que puede codificar caracteres Unicode con puntos de código de hasta 8 dígitos hexadecimales de largo, es decir, todo.
Ejecutar el siguiente código:
byteobject = stringobject.encode('utf-8')
byteobject, type(byteobject)
convierte una cadena Unicode en una cadena de bytes mediante el sistema de codificación UTF-8, y devuelve b'ant', bytes'
.
Tenga en cuenta que si utilizó 'ASCII' como sistema de codificación, no tendría ningún problema ya que todos los puntos de código en 'ant' se pueden expresar con 1 byte. Pero si tuviera una cadena Unicode que contenga caracteres con puntos de código de más de dos dígitos hexadecimales, obtendrá un UnicodeEncodeError
.
Del mismo modo,
stringobject = byteobject.decode('utf-8')
stringobject, type(stringobject)
le da 'ant', str
.
coolinterview.com parece una terrible fuente de información. Yo no confiaría en eso. – bames53
El "código de bytes" generalmente se refiere a algo completamente diferente, http://docs.python.org/glossary.html "El código fuente de Python se compila en bytecode, la representación interna de un programa de Python en el intérprete de CPython. almacenado en caché en archivos .py y .pyo " – dbr
+1 Comentario de dbr. Bytecode es un detalle interno de implementación de CPython que no está relacionado con Unicode y probablemente no tenga que preocuparse. – bobince