使用Python获取字符的Unicode编码点

95 投票
5 回答
95799 浏览
提问于 2025-04-17 01:19

在Python的API中,有没有办法提取单个字符的unicode编码点?

编辑:如果这很重要,我正在使用Python 2.7。

5 个回答

15

其实,搞清楚这个问题还挺复杂的:Python 2和Python 3在从字符串中提取Unicode码点时,有一些微妙的问题。

在Python 3.3之前,Python可以用两种模式来编译:

  1. 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']

这是Linux上Python 2.7的默认设置,也是所有操作系统上Python 3.3及以后的默认设置。

  1. sys.maxunicode == 0xFFFF

在这种模式下,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']

这是macOS和Windows上Python 2.7的默认设置。

这种运行时的差异让编写处理Unicode字符串的Python模块变得相当麻烦。

codepoints模块

为了解决这个问题,我贡献了一个新的模块codepointsPyPI

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'
106

如果我理解你的问题没错的话,你可以这样做。

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

这段代码会把unicode转义码显示为源字符串。

73
>>> 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

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答