在Python API中,是否有一种方法可以提取单个字符的Unicode代码点?
编辑:如果有影响的话,我正在使用Python 2.7。
在Python API中,是否有一种方法可以提取单个字符的Unicode代码点?
编辑:如果有影响的话,我正在使用Python 2.7。
如果我正确理解了你的问题,你可以这样做。
>>> s='㈲'
>>> s.encode("unicode_escape")
b'\\u3232'
显示 Unicode 转义代码作为源字符串。
b
是什么意思? - MK Yung'a'.encode('unicode_escape')
返回的是 a
而不是 '\u。(u'a'.encode('unicode_escape')
也是一样。) 同样,在超出基本多语言平面时,格式也有所不同:u''.encode('unicode_escape')
得到的是 '\\U0001f631'
。 - ShreevatsaR"a".encode("unicode_escape").hex()
来获取十六进制表示的字符串。另外,hex(ord("a"))
也可以实现相同的效果。 - imrek>>> 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
u'e' 101
和 u'\u0301' 769
。 - Dietrich Eppucp = ord(c)
,然后print ucp
,我会得到三个整数,而不是一个整数。如何获得一个整数? - Kenu"བཞིན"
(而不是"བཞིན"
),则不会因为字符大于一个字节而遇到问题 - 但它将把这个字符串视为四个字符,并将 ི 和 ཞ 视为两个不同的字符。我不知道Unicode是否包括藏文的这种组合,就像它为带重音的拉丁语(其中存在单代码点é(u'\xe9'
)和双代码点é(u'e\u0301'
))一样。很抱歉我不能提供更多帮助。 - Mike Graham结果证明正确地解决这个问题相当棘手:Python 2和Python 3在从字符串中提取Unicode代码点方面存在一些微妙的问题。
直到Python 3.3之前,编译Python有两种模式可选:
sys.maxunicode == 0x10FFFF
在这种模式下,Python的Unicode字符串支持从U+0000到U+10FFFF的完整Unicode代码点范围。一个代码点由一个字符串元素表示:
>>> 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
在此模式下,Python的Unicode字符串仅支持从U + 0000到U + FFFF的Unicode代码点范围。任何从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']
这是在 macOS 和 Windows 上使用 Python 2.7 的默认设置。
这个运行时差异使得编写 Python 模块来操作 Unicode 字符串作为代码点序列非常不方便。
为了解决这个问题,我贡献了一个新的模块 codepoints
到 PyPI
:
https://pypi.python.org/pypi/codepoints/1.0
这个模块通过公开 API 将 Unicode 字符串转换为代码点列表,并从代码点列表转换回 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)
? - thadk
#does not work
#print(codepoints.to_unicode(tuple(127462)))
#works
print(codepoints.to_unicode((127462,)))
#works ("AU" Australia Flag)
print(codepoints.to_unicode((127462,127482)))```
- thadk通常,您只需执行ord(character)
即可找到字符的编码点。但为了完整起见,在Python窄构建中,Unicode补充多语言平面中的宽字符表示为代理对(即两个代码单元),因此在这种情况下,我经常需要做这个小的解决方法:
def get_wide_ordinal(char):
if len(char) != 2:
return ord(char)
return 0x10000 + (ord(char[0]) - 0xD800) * 0x400 + (ord(char[1]) - 0xDC00)
在大多数应用程序中,这种情况很少见,因此通常只需使用ord()
。
python2
>>> print hex(ord(u'人'))
0x4eba
ord("\N{HIRAGANA LETTER KU}")
的确是12367,也就是0x304F。我不会像你这样使用数字来表示字符,只用命名的方式。神奇数字对程序有害。只需要将chr
和ord
视为互逆函数即可。这很容易理解。 - tchristchr
是ord
的相反操作,但在Python 2.x中,unichr
才是ord
的相反操作,因为在Python 2.x中,chr
只对小于等于255的序数起作用。 - cryoc
是我的字符变量(假设它等于あ
),如果我执行ucp = ord(c)
,然后print ucp
,我会得到三个整数,而不是一个整数。如何获得一个单一的整数? - Ken