En Python 3.x, una cadena se compone de elementos de Unicode ordinal. (Véase la cita de la referencia del lenguaje a continuación). ¿Cuál es la representación interna de la cadena Unicode? Es UTF-16?

Los elementos de un objeto de cadena son
Código Unicode unidades. Un código Unicode
la unidad está representada por un objeto string
de un elemento y puede realizar una
16-bit o 32-bit valor que representa una
Unicode ordinal (el valor máximo para
el ordinal se da en
sys.maxunicode, y depende de cómo
Python está configurado en tiempo de compilación).
Los pares suplentes pueden estar presentes en el
Unicode objeto, y será reportado
como dos elementos separados.

InformationsquelleAutor thebat | 2009-12-03

7 Comentarios

  1. 1

    No ha habido NINGÚN CAMBIO en Unicode representación interna entre Python 2.X y 3.X.

    Definitivamente NO es UTF-16. UTF-nada es una de bytes orientado a la representación EXTERNA.

    Cada unidad de código (carácter, suplente, etc) ha sido asignado un número del intervalo(0, 2 ** 21). Esto se llama su «ordinal».

    Realmente, la documentación que se cita lo dice todo. La mayoría de Python binarios de 16 bits de los números ordinales, que restringe al Plano Multilingüe Básico («BMP») a menos que usted desea muck con sustitutos (muy útil si usted no puede encontrar su cabello camisa y su cama de clavos es ser de-oxidado). Para trabajar con el repertorio completo de Unicode, prefiere una «amplia construir» (de 32 bits de ancho).

    Brevemente, la representación interna de un objeto unicode es una matriz de 16 bits a enteros sin signo, o una matriz de 32 bits enteros sin signo (utilizando sólo 21 bits).

    • «El almacenamiento de la unicode codeponts en enteros de 16 bits» se llama «UCS-2». Haciendo lo mismo con la de 32 bits enteros es UCS-4.
    • así que si se compila con UCS-4 modo, entonces usted no tiene que preocuparse acerca de los pares suplentes en todos?
    • Sauer: el UCS-n son en realidad antiguos codificaciones, no formas de almacenar los puntos de codificación de Unicode en (n*8) bits enteros. UCS-2 (que se limita a la BMP) ha sido sustituida por el UTF-16. Ver, por ejemplo, en.wikipedia.org/wiki/UTF-16/UCS-2
    • Esa es la idea general. La terminología preferida es «estrecho/ancho Py_Unicode», no «UCS-n».
    • No entiendo lo que estás tratando de decir. ¿Qué es un sistema de codificación si no es una «forma de almacenamiento de puntos de codificación de Unicode» (o información de carácter más general). Y sí, soy bien consciente de que UTF-16 es la alternativa moderna a UCS-2, pero no es el mismo, como usted dice. UTF-16 es compatible con todos Unicode, pero UCS-2 sólo el BMP.
    • «No ha habido NINGÚN CAMBIO…». En realidad, ver a PEP 393 (enero de 2010), la cual establece que el cambio que vino posteriormente, y otra respuesta aquí «La representación interna va a cambiar…»
    • Esta respuesta es errónea, ver Tobu la respuesta a continuación. PEP 393 fue escrito con un mes de después esta fue la respuesta.
    • «UTF-nada es una de bytes orientado a la representación EXTERNA». En algunos sistemas es también válida la representación INTERNA. Por ejemplo, en muchos C++ sistemas basados en UTF-8 es usado internamente, no sólo para I/O. E Ir específicamente usa UTF-8 como internos de representación de cadena.
    • Esta respuesta parece haber confundido a Unicode con UTF-16, y unidades de código con el código de puntos. Consulte este desbordamiento de pila pregunta para algunas aclaraciones sobre el segundo.

  2. 25

    La representación interna que va a cambiar en Python 3.3 que implementa PEP 393. La nueva representación seleccionará uno o varios de ascii, latin-1, utf-8, utf-16, utf-32, generalmente tratando de obtener una representación compacta.

    Conversiones implícitas en los pares suplentes sólo será posible cuando se habla de legado Api (aquellos que sólo existen en windows, donde wchar_t es de dos bytes); la cadena Python será preservada. Aquí están las notas de la versión.

    • A mí me parece que PEP 393 dice que la representación interna es la más compacta (de una determinada cadena de caracteres ASCII, Latin-1 (UCS1), UCS2 o UCS4. Es decir: en concreto NO utf-8/16/32. La razón: Python debe ser la constante de tiempo de índice en una cadena, por lo tanto los caracteres debe ser de tamaño uniforme, que es el caso de UCS, pero no para utf representaciones.
    • PEP 393 dice todo…
    • Latin-1 es un superconjunto de ASCII, así que no hay razón para incluir ASCII como una de las opciones. Las opciones son: (a) uniforme de 8 bits, es decir, Latin-1, (b) uniforme de 16 bits, es decir, UCS2, o (c) de manera uniforme de 32 bits, es decir, UCS4 (que es el mismo como UTF-32). En particular, se excluyen los UTF-8 y UTF-16, que no tienen un uniforme número de bits por punto de código
  3. 10

    En Python 3.3 y, encima, la representación interna de la cadena dependerá de la cadena, y puede ser cualquiera de latin-1, UCS-2 o UCS-4, como se describe en PEP 393.

    Anteriores Pitones, la representación interna depende de la acumulación banderas de Python. Python puede ser construido con los valores del indicador --enable-unicode=ucs2 o --enable-unicode=ucs4. ucs2 se basa, de hecho,el uso de UTF-16, así como su representación interna, y ucs4 construye uso UCS-4 /UTF-32.

  4. 6

    Mirando el código fuente de CPython 3.1.5, en Include/unicodeobject.h:

    /* --- Unicode Type ------------------------------------------------------- */
    
    typedef struct {
        PyObject_HEAD
        Py_ssize_t length;          /* Length of raw Unicode data in buffer */
        Py_UNICODE *str;            /* Raw Unicode buffer */
        long hash;                  /* Hash value; -1 if not set */
        int state;                  /* != 0 if interned. In this case the two
                                     * references from the dictionary to this object
                                     * are *not* counted in ob_refcnt. */
        PyObject *defenc;           /* (Default) Encoded version as Python
                                       string, or NULL; this is used for
                                       implementing the buffer protocol */
    } PyUnicodeObject;

    Los caracteres se almacenan como un conjunto de Py_UNICODE. En la mayoría de plataformas, creo Py_UNICODE es #defined como wchar_t.

  5. 0

    Creo, Su difícil juzgar la diferencia entre UTF-16, que es sólo una de las secuencias de 16 bits de palabras, a Python del objeto string.

    Y Si python es compilado con Unicode=UCS4 opción, será la comparación entre UTF-32 y cadena Python.

    Así que mejor considere, están en una categoría diferente, aunque puede transformar cada uno de los otros.

  6. 0
    >>> import array; s = 'Привет мир!'; b = array.array('u', s).tobytes(); print(b); print(len(s) * 4 == len(b))
    b'\x1f\x04\x00\[email protected]\x04\x00\x008\x04\x00\x002\x04\x00\x005\x04\x00\x00B\x04\x00\x00 \x00\x00\x00<\x04\x00\x008\x04\x00\[email protected]\x04\x00\x00!\x00\x00\x00'
    True
    >>> import array; s = 'test'; b = array.array('u', s).tobytes(); print(b); print(len(s) * 4 == len(b))
    b't\x00\x00\x00e\x00\x00\x00s\x00\x00\x00t\x00\x00\x00'
    True
    >>> 

Dejar respuesta

Please enter your comment!
Please enter your name here