Полагаю, что я на самом деле имею в виду: «Почему кто-то предложил бы рассматривать UTF-16 как фиксированную кодировку, когда она кажется фиктивной?»
Два слова: Обратная совместимость.
Изначально Unicode предназначался для использования 16-разрядного кодирования фиксированной ширины (UCS-2), поэтому первые пользователи Unicode (например, Sun с Java и Microsoft с Windows NT) использовали16-битный тип символов.Когда выяснилось, что 65 536 символов недостаточно для всех, был разработан UTF-16, чтобы позволить этим 16-битным системам символов представлять 16 новых «плоскостей».
Это означало, что символы не былибольше фиксированной ширины, поэтому люди создали рационализацию, что «все в порядке, потому что UTF-16 имеет почти фиксированную ширину».
Но я все еще не уверен, что это немного отличаетсяПредполагая, что UTF-8 является однобайтовыми символами!
Строго говоря, это , а не .Вы получите неверные результаты для таких вещей, как "\uD801\uDC00".lower()
.
Однако, если предположить, что UTF-16 является фиксированной шириной, вероятность ее поломки будет меньше, чем при условии, что UTF-8 является фиксированной шириной.Символы, не входящие в ASCII, очень распространены на других языках, кроме английского, но символы, отличные от BMP, очень редки.
Вы можете использовать ту же специальную обработку, которую вы используете для объединения символов, чтобы обрабатывать суррогатные пары вUTF-16
Я не знаю, о чем он говорит.Комбинированные последовательности, составные символы которых имеют индивидуальную идентичность, совсем не похожи на суррогатные символы, которые имеют смысл только в парах.
В частности, символы в последовательности объединения могут быть преобразованы в другую форму кодированиясимволов за раз.
>>> 'a'.encode('UTF-8') + '\u0301'.encode('UTF-8')
b'a\xcc\x81'
Но не суррогаты:
>>> '\uD801'.encode('UTF-8') + '\uDC00'.encode('UTF-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'utf-8' codec can't encode character '\ud801' in position 0: surrogates not allowed