type caracteres python unicode character-encoding utf-16

caracteres - Unicode en Python, ¿solo UTF-16?



unicode en python 3 (1)

Estaba feliz en mi mundo de Python sabiendo que estaba haciendo todo en Unicode y codificando como UTF-8 cuando necesitaba generar algo para un usuario. Entonces, uno de mis colegas me envió este artículo sobre UTF-8 y me confundió.

El autor del artículo indica varias veces que UCS-2, la representación Unicode que utiliza Python es sinónimo de UTF-16. Incluso va tan lejos como para decir directamente que Python usa UTF-16 para la representación interna de cadenas.

El autor también admite ser un desarrollador y amante de Windows y afirma que la forma en que MS ha manejado las codificaciones de los personajes a lo largo de los años ha llevado a que ese grupo sea el más confundido, así que tal vez sea solo su propia confusión. No lo sé...

¿Puede alguien explicar por favor qué es el estado de UTF-16 frente a Unicode en Python? ¿Son sinónimos y si no, de qué manera?


La representación interna de una cadena Unicode en Python (versiones desde 2.2 hasta 3.2) depende de si Python fue compilado en modos anchos o estrechos . La mayoría de las compilaciones de Python son angostas (puede verificarlas con sys.maxunicode : 65535 en compilaciones estrechas y 1114111 en compilaciones anchas).

Con una compilación amplia, las cadenas son secuencias internas de caracteres de 4 bytes de ancho, es decir, usan la codificación UTF-32. Todos los puntos de código tienen exactamente un ancho de carácter ancho.

Con una compilación estrecha, las cadenas son secuencias internas de caracteres de 2 bytes de ancho, utilizando UTF-16. Los caracteres más allá del BMP (puntos de código U + 10000 y superiores) se almacenan utilizando los pares de sustituto UTF-16 habituales:

>>> q = u''/U00010000'' >>> len(q) 2 >>> q[0] u''/ud800'' >>> q[1] u''/udc00'' >>> q u''/U00010000''

Tenga en cuenta que UTF-16 y UCS-2 no son lo mismo. UCS-2 es una codificación de ancho fijo: cada punto de código se codifica como 2 bytes. En consecuencia, UCS-2 no puede codificar puntos de código más allá del BMP. UTF-16 es una codificación de ancho variable; los puntos de código fuera del BMP se codifican utilizando un par de caracteres, llamados par suplente.

Tenga en cuenta que todo esto cambia en 3.3, con la implementación de PEP 393 . Ahora, las cadenas Unicode se representan con caracteres lo suficientemente amplios como para contener el mayor punto de código: 8 bits para cadenas ASCII, 16 bits para cadenas BMP y 32 bits en caso contrario. Esto elimina la brecha amplia / estrecha y también ayuda a reducir el uso de la memoria cuando se usan muchas cadenas de solo ASCII.