Unicode индексация Python показывает другой символ - PullRequest
2 голосов
/ 20 марта 2019

У меня есть строка Unicode в «узкой» сборке Python 2.7.10, содержащая символ Unicode.Я пытаюсь использовать этот символ Unicode для поиска в словаре, но когда я индексирую строку, чтобы получить последний символ Unicode, он возвращает другую строку:

>>> s = u'Python is fun \U0001f44d'
>>> s[-1]
u'\udc4d'

Почему это происходит, икак мне извлечь '\U0001f44d' из строки?

Редактировать: unicodedata.unidata_version равно 5.2.0 и sys.maxunicode равно 65535.

Screenshot of issue

Ответы [ 2 ]

3 голосов
/ 20 марта 2019

Похоже, что ваша сборка Python 2 использует суррогаты для представления кодовых точек за пределами базовой многоязычной плоскости. Смотрите, например Как работать с суррогатными парами в Python? для немного фона.

Я бы порекомендовал перейти на Python 3 для всего, что связано с обработкой строк, как можно скорее.

2 голосов
/ 20 марта 2019

«Узкая» сборка Python 2 использует UTF-16 для хранения строк Unicode (так называемая негерметичная абстракция , поэтому кодовые точки> U + FFFF - это два суррогата UTF. Чтобы извлечь кодовую точку, Вы должны получить как ведущий, так и конечный суррогат:

Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> s = u'Python is fun \U0001f44d'
>>> s[-1]     # Just the trailing surrogate
u'\udc4d'
>>> s[-2:]    # leading and trailing
u'\U0001f44d'

Переключитесь на Python 3.3+, где проблема была решена и детали хранения кодовых точек Unicode в строке Unicode не отображаются:

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> s = u'Python is fun \U0001f44d'
>>> s[-1]   # code points are stored in Unicode strings.
'\U0001f44d'
...