Pregunta

Me topé con este pasaje en el tutorial de django:

Los modelos de Django tienen un valor predeterminado. cadena() método que llama 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 ninguna representación particular, entonces, ¿qué es una "cadena Unicode" en Python?¿Eso significa UCS-2?Apareció Google este "Tutorial de Python Unicode" que afirma audazmente

Unicode es una codificación de dos bytes que cubre todos los sistemas de escritura comunes del mundo.

¿Qué está completamente mal, o no?Me han confundido muchas veces los problemas de codificación y juego de caracteres, pero aquí estoy bastante seguro de que la documentación que estoy leyendo es confusa.¿Alguien sabe qué sucede en Python cuando me da una "cadena Unicode"?

¿Fue útil?

Solución

¿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 igual que UTF-16) o UCS-4/UTF-32 (representación de 32 bits de longitud fija).Es una opción en 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.

Generalmente no se supone que te importe:Verá puntos de código Unicode como elementos individuales en sus cadenas y no sabrá si están almacenados como dos o cuatro bytes.Si estás en una compilación UTF-16 y necesitas manejar caracteres fuera del plano multilingüe básico, lo estarás haciendo mal, pero eso sigue siendo muy raro, y los usuarios que realmente necesitan caracteres adicionales deberían compilar compilaciones amplias.

simplemente incorrecto, ¿o no?

Sí, está bastante mal.Para ser justos, creo que ese tutorial es bastante antiguo;probablemente sea anterior a las cadenas Unicode anchas, si no a Unicode 3.1 (la versión que introdujo caracteres fuera del plano multilingüe básico).

Existe una fuente adicional de confusión que surge del hábito de Windows de utilizar el término "Unicode" para referirse, específicamente, a la codificación UTF-16LE que NT utiliza internamente.La gente de Microsoftland suele copiar este hábito un tanto engañoso.

Otros consejos

Mientras tanto, hice una investigación refinada para verificar cuál es la representación interna en Python y también cuáles son sus límites."La verdad sobre Unicode en Python" es un artículo muy bueno que cita directamente a los desarrolladores de Python.Aparentemente, la representación interna es UCS-2 o UCS-4 dependiendo de un cambio en tiempo de compilación.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.

De Wikipedia sobre UTF-8:

UTF-8 (formato de transformación UCS/Unicode de 8 bits) es un 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 versiones anteriores de ASCII.Por estas razones, se está convirtiendo constantemente en la codificación preferida para correos electrónicos, páginas web[1] y otros lugares donde se almacenan o transmiten caracteres.

Por lo tanto, está entre uno y cuatro bytes dependiendo del carácter que desee representar dentro del ámbito de Unicode.

De Wikipedia en Unicode:

En informática, Unicode es un estándar industrial que permite a las computadoras representar y manipular consistentemente 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 :)

Entonces, ¿qué es una "cadena unicode" en Python?

Python 'sabe' que su cadena es Unicode.Por lo tanto, si realiza expresiones regulares en él, sabrá cuál es un carácter y cuál no, etc., lo cual es realmente útil.Si hiciste un strlen también dará el resultado correcto.Como ejemplo, si contó cadenas en Hola, obtendrá 5 (incluso si es Unicode).Pero si hizo un recuento de cadenas de una palabra extranjera y esa cadena no era una cadena Unicode, obtendrá un resultado mucho mayor.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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top