Подтвердить что ты не робот

Что такое внутреннее представление строки в Python 3.x

В Python 3.x строка состоит из элементов порядкового номера Unicode. (См. Цитату из приведенной ниже ссылки на язык.) Каково внутреннее представление строки Unicode? Это UTF-16?

Элементы строкового объекта Единицы кода Юникода. Код Юникода единица представлена ​​строковым объектом одного элемента и может содержать 16-битное или 32-битное значение, представляющее Unicode порядковый номер (максимальное значение для порядковый номер приведен в sys.maxunicode, и зависит от того, как Python настроен во время компиляции). Суррогатные пары могут присутствовать в Unicode, и будет сообщено как два отдельных элемента.

4b9b3361

Ответ 1

НЕТ ИЗМЕНЕНИЙ во внутреннем представлении Unicode между Python 2.X и 3.X.

Это определенно НЕ UTF-16. UTF-anything - это байтовое ориентированное представление EXTERNAL.

Каждому блоку кода (символу, суррогату и т.д.) присвоен номер из диапазона (0, 2 ** 21). Это называется его "порядковым".

Действительно, в документации, которую вы цитируете, сказано все. Большинство двоичных файлов Python используют 16-битные ординалы, которые ограничивают вас базовым многоязычным языком ( "BMP" ), если вы не хотите гадать с суррогатами (удобно, если вы не можете найти свою рубашку для волос, а ваша гвоздь - ржавчина). Для работы с полным репертуаром Unicode вы бы предпочли "широкую сборку" (32 бита в ширину).

Вкратце, внутреннее представление в объекте unicode представляет собой массив из 16-разрядных целых без знака или массив из 32-разрядных целых без знака (с использованием только 21 бит).

Ответ 2

Внутреннее представление будет изменено в Python 3.3, которое реализует PEP 393. Новое представление будет выбирать один или несколько ascii, latin-1, utf-8, utf-16, utf-32, как правило, для получения компактного представления.

Неявные преобразования в суррогатные пары будут выполняться только при разговоре с устаревшими API (они существуют только в окнах, где wchar_t - два байта); строка Python будет сохранена. Вот примечания к выпуску.

Ответ 3

Глядя на исходный код для CPython 3.1.5, в 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;

Символы сохраняются как массив Py_UNICODE. На большинстве платформ я считаю, что Py_UNICODE #define d как wchar_t.

Ответ 4

В Python 3.3 и выше внутреннее представление строки будет зависеть от строки и может быть любым из ascii, latin-1, utf-8, utf-16, utf-32, как отмечено Tobu и описано в PEP 393.

Для предыдущих Pythons внутреннее представление зависит от флагов сборки Python. Python может быть построен с значениями флага --enable-unicode=ucs2 или --enable-unicode=ucs4. ucs2 на самом деле используют UTF-16 в качестве внутреннего представления, а ucs4 использует UCS-4/UTF-32.

Ответ 5

Это зависит: см. здесь. Это все еще верно для Python 3, поскольку внутреннее представление идет.

Ответ 6

Я думаю, его трудно судить о различии между UTF-16, который представляет собой всего лишь последовательность из 16-битных слов, для строкового объекта Python.

И если python скомпилирован с параметром Unicode = UCS4, он будет сравнивать между строками UTF-32 и Python.

Итак, лучше подумайте, что они находятся в разных категориях, хотя вы можете трансформировать друг друга.