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




string unicode (5)

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

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


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

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


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

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


Между Python 2.X и 3.X не было никаких изменений во внутреннем представлении Unicode.

Это определенно НЕ UTF-16. UTF-что-нибудь - это байтовое ВНЕШНЕЕ представление.

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

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

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


Это зависит: смотрите here . Это все еще верно для Python 3 в отношении внутреннего представления.


>>> 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
>>> 




python-3.x