¿Qué es una cadena de Unicode?

¿Qué es exactamente una cadena de Unicode?

¿Cuál es la diferencia entre una cadena normal y una cadena Unicode?

¿Qué es utf-8?

Estoy tratando de aprender Python en este momento, y sigo escuchando esta palabra de moda. ¿Qué hace el código de abajo?

Cuerdas i18n (Unicode)

> ustring = u'A unicode \u018e string \xf1' > ustring u'A unicode \u018e string \xf1' ## (ustring from above contains a unicode string) > s = ustring.encode('utf-8') > s 'A unicode \xc6\x8e string \xc3\xb1' ## bytes of utf-8 encoding > t = unicode(s, 'utf-8') ## Convert bytes back to a unicode string > t == ustring ## It's the same as the original, yay! True 

Archivos Unicode

 import codecs f = codecs.open('foo.txt', 'rU', 'utf-8') for line in f: # here line is a *unicode* string 

Esta respuesta es sobre Python 2. En Python 3, str es una cadena Unicode.

El tipo str de Python es una colección de caracteres de 8 bits. El alfabeto inglés puede representarse utilizando estos caracteres de 8 bits, pero no pueden hacerlo símbolos como ±, ♠, Ω y ℑ.

Unicode es un estándar para trabajar con una amplia gama de caracteres. Cada símbolo tiene un punto de código (un número), y estos puntos de código se pueden codificar (convertir en una secuencia de bytes) utilizando una variedad de codificaciones.

UTF-8 es una de esas codificaciones. Los puntos de código bajos se codifican utilizando un solo byte, y los puntos de código más altos se codifican como secuencias de bytes.

El tipo unicode de Python es una colección de puntos de código. La línea ustring = u'A unicode \u018e string \xf1' crea una cadena de Unicode con 20 caracteres.

Cuando el intérprete de Python muestra el valor de ustring , escapa a dos de los caracteres (Ǝ y ñ) porque no están en el rango de impresión estándar.

La línea s = unistring.encode('utf-8') codifica la cadena Unicode usando UTF-8. Esto convierte cada punto de código al byte o secuencia de bytes apropiado. El resultado es una colección de bytes, que se devuelve como un str . El tamaño de s es de 22 bytes, porque dos de los caracteres tienen puntos de código altos y están codificados como una secuencia de dos bytes en lugar de un solo byte.

Cuando el intérprete de Python muestra el valor de s , escapa a cuatro bytes que no están en el rango imprimible ( \xc6 , \x8e , \xc3 y \xb1 ). Los dos pares de bytes no se tratan como caracteres individuales como antes porque s es de tipo str , no unicode .

La línea t = unicode(s, 'utf-8') hace lo opuesto a encode() . Reconstruye los puntos de código originales mirando los bytes de s y analizando las secuencias de bytes. El resultado es una cadena Unicode.

La llamada a codecs.open() especifica utf-8 como la encoding, que le dice a Python que interprete el contenido del archivo (una colección de bytes) como una cadena Unicode que se ha codificado utilizando UTF-8.

Python admite el tipo de cadena y el tipo Unicode. Una cadena es una secuencia de caracteres, mientras que un Unicode es una secuencia de “punteros”. Unicode es una representación en memoria de la secuencia y cada símbolo en ella no es un char sino un número (en formato hexadecimal) destinado a seleccionar un char en un mapa. Entonces, una var de Unicode no tiene encoding porque no contiene caracteres.