В Python API есть ли способ извлечь кодовую точку Unicode для одного символа?
Изменить: если это имеет значение, я использую Python 2.7.
В Python API есть ли способ извлечь кодовую точку Unicode для одного символа?
Изменить: если это имеет значение, я использую Python 2.7.
Если я правильно понял ваш вопрос, вы можете это сделать.
>>> s='㈲'
>>> s.encode("unicode_escape")
b'\\u3232'
Показывает escape-код Unicode в виде исходной строки.
b
?
- person MK Yung; 18.12.2013
'a'.encode('unicode_escape')
дает a
вместо '\\u. (То же самое с u'a'.encode('unicode_escape')
.) Кроме того, формат отличается, когда вы выходите за пределы базовой многоязычной плоскости: u'????'.encode('unicode_escape')
дает '\\U0001f631'
.
- person ShreevatsaR; 29.12.2013
"a".encode("unicode_escape").hex()
, чтобы получить шестнадцатеричное представление в виде str
. В качестве альтернативы также подойдет hex(ord("a"))
.
- person imrek; 15.05.2017
Обычно вы просто делаете 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()
.
D71 High-surrogate code point: A Unicode code point in the range U+D800 to U+DBFF.
и младшего эквивалента D73?
- person John Machin; 07.02.2013
Оказывается, сделать это правильно довольно сложно: в Python 2 и Python 3 есть некоторые тонкие проблемы с извлечением кодовых точек Unicode из строки.
Вплоть до Python 3.3 можно было компилировать Python в одном из двух режимов:
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 и более поздних версий во всех операционных системах.
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'
codepoints.to_unicode(x)
в измененных кодах, которые были смещены соответствующими буквами базового флага?
- person thadk; 06.03.2017
питон2
>>> print hex(ord(u'人'))
0x4eba
u'e' 101
и u'\u0301' 769
в конце...
- person Dietrich Epp; 03.09.2011
ucp = ord(c)
, затем print ucp
, я получаю три целых числа, а не одно целое. Как получить одно целое число?
- person SK9; 03.09.2011
u"བཞིན"
(а не "བཞིན"
, вы не столкнетесь с проблемами из-за того, что символы больше одного байта - однако он будет рассматривать это как четыре символа, причем ི и ཞ считаются двумя разными Я не знаю, включает ли Unicode такие комбинации для тибетского языка, как для латыни с акцентом (где существуют как é с одной кодовой точкой (u'\xe9'
), так и é с двумя кодовыми точками (u'e\u0301'
). Извините, я не могу быть более полезным.
- person Mike Graham; 06.01.2018
ord("\N{HIRAGANA LETTER KU}")
действительно 12367, он же 0x304F. Я бы никогда не использовал числа для символов, как вы, а только имена, как я. Магические числа вредны для вашей программы. Просто подумайте оchr
иord
как об обратных функциях друг друга. Это очень просто. - person tchrist   schedule 03.09.2011chr
является противоположностьюord
в python 3.x, но в python 2.xunichr
является обратнымord
, посколькуchr
работает только для порядковых номеров до 255 в python 2.x. - person cryo   schedule 03.09.2011chr
иord
всегда должны были быть обратными, и это была устаревшая ошибка Python 2, которой они иногда не были. Это безумие. - person tchrist   schedule 03.09.2011str
иunicode
. - person cryo   schedule 03.09.2011c
является моей символьной переменной (скажем, она равнаあ
), если я делаюucp = ord(c)
, тоprint ucp
я получаю три целых числа, а не одно целое. Как получить одно целое число? - person SK9   schedule 03.09.2011