Получить кодовую точку Unicode символа с помощью Python - PullRequest
40 голосов
/ 03 сентября 2011

В Python API есть способ извлечь кодовую точку Unicode для одного символа?

Редактировать: Если это имеет значение, я использую Python 2.7.

Ответы [ 5 ]

48 голосов
/ 03 сентября 2011

Если я правильно понимаю ваш вопрос, вы можете сделать это.

>>> s='㈲'
>>> s.encode("unicode_escape")
b'\\u3232'

Показывает escape-код Unicode в виде исходной строки.

35 голосов
/ 03 сентября 2011
>>> ord(u"ć")
263
>>> u"café"[2]
u'f'
>>> u"café"[3]
u'\xe9'
>>> for c in u"café":
...     print repr(c), ord(c)
... 
u'c' 99
u'a' 97
u'f' 102
u'\xe9' 233
10 голосов
/ 03 сентября 2011

Обычно, вы просто делаете ord(character), чтобы найти кодовую точку символа.Для полноты, однако, широкие символы в дополнительной многоязычной плоскости Unicode представлены в виде суррогатных пар (то есть двух единиц кода) в узких сборках Python, поэтому в этом случае мне часто приходилось выполнять этот небольшой обходной прием:

def get_wide_ordinal(char):
    if len(char) != 2:
        return ord(char)
    return 0x10000 + (ord(char[0]) - 0xD800) * 0x400 + (ord(char[1]) - 0xDC00)

Это редко в большинстве приложений, поэтому обычно просто используйте ord().

5 голосов
/ 16 февраля 2017

Оказывается, получить это право довольно сложно: у Python 2 и Python 3 есть некоторые тонкие проблемы с извлечением кодовых точек Unicode из строки.

Вплоть до Python 3.3 можно было компилировать Python в одном из двух режимов:

  1. sys.maxunicode == 0x10FFFF

В этом режиме строки Unicode в Python поддерживают полный диапазон кодовых точек Unicode от U + 0000 до U + 10FFFF. Одна кодовая точка представлена ​​одним строковым элементом:

>>> import sys
>>> hex(sys.maxunicode)
'0x10ffff'
>>> len(u'\U0001F40D')
1
>>> [c for c in u'\U0001F40D']
[u'\U0001f40d']

Это значение по умолчанию для Python 2.7 в Linux, а также универсально для Python 3.3 и более поздних версий во всех операционных системах.

  1. sys.maxunicode == 0xFFFF

В этом режиме строки Unicode в Python поддерживают только диапазон кодовых точек Unicode от U + 0000 до U + FFFF. Любые кодовые точки от U + 10000 до U + 10FFFF представлены с использованием пары строковых элементов в кодировке UTF-16: *

>>> import sys
>>> hex(sys.maxunicode)
'0xffff'
>>> len(u'\U0001F40D')
2
>>> [c for c in u'\U0001F40D']
[u'\ud83d', u'\udc0d']

Это значение по умолчанию для Python 2.7 в macOS и Windows.

Это различие во время исполнения делает написание модулей Python для манипулирования строками Unicode как серии кодов очень неудобно.

Модуль кодовых точек

Чтобы решить эту проблему, я добавил новый модуль codepoints в PyPI:

https://pypi.python.org/pypi/codepoints/1.0

Этот модуль решает проблему, предоставляя API для преобразования строк Unicode в и из списков кодовых точек, независимо от базовой настройки для sys.maxunicode ::

>>> hex(sys.maxunicode)
'0xffff'
>>> snake = tuple(codepoints.from_unicode(u'\U0001F40D'))
>>> len(snake)
1
>>> snake[0]
128013
>> hex(snake[0])
'0x1f40d'
>>> codepoints.to_unicode(snake)
u'\U0001f40d'
0 голосов
/ 04 июля 2019

python2

>>> print hex(ord(u'人'))
0x4eba
...