CPython хранит строки Unicode как utf-16 или utf-32 внутри, в зависимости от параметров компиляции.В сборках utf-16 Python срезы строк, итерации и len
, кажется, работают на единицах кода, а не на точках кода, так что многобайтовые символы ведут себя странно.
Например, на CPython 2.6 с sys.maxunicode
=65535:
>>> char = u'\U0001D49E'
>>> len(char)
2
>>> char[0:1]
u'\uu835'
>>> char[1:2]
u'\udc9e'
Согласно документации Python, sys.maxunicode
- это "целое число, дающее наибольшую поддерживаемую кодовую точку для символа Unicode."
Делает ли этоОзначает ли это, что unicode
операции не гарантированно работают с кодами, превышающими sys.maxunicode
?Если я хочу работать с символами вне BMP, мне нужно либо использовать сборку utf-32, либо написать свои собственные переносимые unicode
операции?
Я столкнулся с этой проблемой в Как перебирать Unicodeсимволы в Python 3?