Что такое внутреннее представление строки в Python 3.x
В Python 3.x строка состоит из элементов порядкового номера Unicode. (См. Цитату из приведенной ниже ссылки на язык.) Каково внутреннее представление строки Unicode? Это UTF-16?
Элементы строкового объекта Единицы кода Юникода. Код Юникода единица представлена строковым объектом одного элемента и может содержать 16-битное или 32-битное значение, представляющее Unicode порядковый номер (максимальное значение для порядковый номер приведен в sys.maxunicode, и зависит от того, как Python настроен во время компиляции). Суррогатные пары могут присутствовать в Unicode, и будет сообщено как два отдельных элемента.
Ответы
Ответ 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.
Итак, лучше подумайте, что они находятся в разных категориях, хотя вы можете трансформировать друг друга.