2008-08-22 10 views
28

I tropezado con este pasaje en el Django tutorial:Unicode vs UTF-8 confusión en Python/Django?

modelos de Django tienen un método predeterminado str() 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 una representación particular, entonces ¿qué es una "cadena Unicode" en Python? ¿Eso significa UCS-2? Googlear aparecido this "Python Unicode Tutorial" que establece audazmente

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

que es completamente falso, ¿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"?

Respuesta

47

¿Qué es una "cadena Unicode" en Python? ¿Eso significa UCS-2?

cadenas Unicode en Python se almacenan internamente ya sea como UCS-2 (de longitud fija representación de 16 bits, casi el mismo que UTF-16) o UCS-4/UTF-32 (de longitud fija de 32 bits representación). 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 debe preocuparse: verá los 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.

llano mal, o es?

Sí, es un error. 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 utilizar 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.

+1

Por favor, personas, voten esta respuesta, incluso si la otra "respuesta" elegida sigue siendo elegida. – tzot

+0

[encogimiento de hombros] ambos son correctos; son las implicaciones de 'len (' ΤΖΩΤΖΙΟΥ ') == 8' que realmente definen lo que es una cadena Unicode * is *, supongo. – bobince

+2

No estoy de acuerdo; Leí la pregunta y dice "¿Qué es una cadena Unicode en Python". La respuesta elegida parece una malla de oraciones aleatorias, mientras que su respuesta parece mucho más precisa; sin embargo, este es un problema que no perseguiré más. Saludos :) – tzot

0

Python almacena Unicode como UTF-16. str() devolverá la representación UTF-8 de la cadena UTF-16.

+1

Python almacena cadenas Unicode como UTF-16 o UTF-32, según la plataforma y las opciones de compilación. – tzot

+0

¿En qué plataforma devuelve str (unicode_string) UTF-8? ¿Lo intentaste? p.ej. str (u "\ u0369") – tzot

+2

Incorrecto en ambos casos. 'str (unicode_val)' codificará según 'sys.getdefaultencoding()'. – Tobu

-1

De Wikipedia on UTF-8:

UTF-8 (8-bit UCS/Unicode Transformation Format) es una codificación de caracteres de longitud variable para Unicode. Puede 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 retrocompatible 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, tiene entre uno y cuatro bytes, dependiendo del personaje que desee representar en el ámbito de Unicode.

From Wikipedia on Unicode:

En informática, Unicode es un estándar de la industria permite a los ordenadores representan de manera consistente y manipular texto expresa en la mayor parte 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 :)

-2

así que lo que 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.

8

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. "The Truth About Unicode In 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.

Cuestiones relacionadas