Unicode vs UTF-8 confusión en Python/Django?
encoding django (5)
¿Qué es una "cadena Unicode" en Python? ¿Eso significa UCS-2?
Las cadenas Unicode en Python se almacenan internamente como UCS-2 (representación de 16 bits de longitud fija, casi lo mismo que UTF-16) o UCS-4 / UTF-32 (representación de 32 bits de longitud fija). Es una opción de tiempo de compilación; en Windows siempre es UTF-16, mientras que muchas distribuciones de Linux configuran UTF-32 (''modo ancho'') para sus versiones de Python.
Por lo general, no se le debe importar: verá puntos de código Unicode como elementos únicos en sus cadenas y no sabrá si están almacenados en dos o cuatro bytes. Si está en una compilación UTF-16 y necesita manejar caracteres fuera del plano multilingüe básico, estará haciendo las cosas mal, pero eso todavía es muy raro, y los usuarios que realmente necesitan los caracteres adicionales deberían estar compilando compilaciones amplias.
Claramente mal, ¿o no?
Sí, está bastante mal. Para ser justos, creo que el tutorial es bastante antiguo; probablemente sea anterior a cadenas de Unicode anchas, sino Unicode 3.1 (la versión que introdujo caracteres fuera del plano multilingüe básico).
Existe una fuente adicional de confusión derivada del hábito de Windows de usar el término "Unicode" para significar, específicamente, la codificación UTF-16LE que NT usa internamente. La gente de Microsoft puede a menudo copiar este hábito algo engañoso.
Tropecé con este pasaje en el tutorial de Django :
Los modelos Django tienen un método predeterminado str () que llama a unicode () y convierte el resultado a una cadena de bytes UTF-8. Esto significa que unicode (p) devolverá una cadena Unicode, y str (p) devolverá una cadena normal, con caracteres codificados como UTF-8.
Ahora, estoy confundido porque afaik Unicode no es una representación particular, entonces ¿qué es una "cadena Unicode" en Python? ¿Eso significa UCS-2? Google buscó este "Tutorial de Unicode de Python" que afirma audazmente
Unicode es una codificación de dos bytes que cubre todos los sistemas de escritura comunes del mundo.
lo cual es completamente incorrecto, ¿o no? Muchas veces me han confundido los conjuntos de caracteres y los problemas de codificación, pero aquí estoy bastante seguro de que la documentación que estoy leyendo es confusa. ¿Alguien sabe qué está pasando en Python cuando me da una "cadena Unicode"?
Entonces, ¿qué es una "cadena Unicode" en Python?
Python ''sabe'' que su cadena es Unicode. Por lo tanto, si haces regex sobre él, sabrá cuál es el carácter y cuál no, etc., que es realmente útil. Si hiciste un strlen también dará el resultado correcto. Como ejemplo, si cuelaste la cadena en Hello, obtendrás 5 (incluso si es Unicode). Pero si hiciste un recuento de cadenas de una palabra extranjera y esa cadena no era una cadena Unicode, obtendrás resultados mucho más grandes. Pythong utiliza la información de la base de datos de caracteres Unicode para identificar cada carácter en la cadena Unicode. Espero que ayude.
De Wikipedia en UTF-8 :
UTF-8 (8-bit UCS / Unicode Transformation Format) es una codificación de caracteres de longitud variable para Unicode. Es capaz de representar cualquier carácter en el estándar Unicode , sin embargo, la codificación inicial de códigos de bytes y asignaciones de caracteres para UTF-8 es compatible con ASCII. Por estos motivos, se está convirtiendo constantemente en la codificación preferida para el correo electrónico, las páginas web [1] y otros lugares donde se almacenan o transmiten los caracteres.
Por lo tanto, está entre uno y cuatro bytes, dependiendo del personaje que desee representar dentro del ámbito de Unicode.
En informática, Unicode es un estándar de la industria que permite que las computadoras representen y manipulen constantemente el texto expresado en la mayoría de los sistemas de escritura del mundo .
Por lo tanto, es capaz de representar la mayoría (pero no todos) de los sistemas de escritura del mundo.
Espero que esto ayude :)
Mientras tanto, hice una investigación refinada para verificar cuál es la representación interna en Python y cuáles son sus límites. " La verdad sobre Unicode en Python " es un muy buen artículo que cita directamente de los desarrolladores de Python. Aparentemente, la representación interna es UCS-2 o UCS-4 dependiendo de un cambio en tiempo de compilación. Entonces, Jon, no es UTF-16, pero tu respuesta me puso en el camino correcto de todos modos, gracias.
Python almacena Unicode como UTF-16. str () devolverá la representación UTF-8 de la cadena UTF-16.