使用Python获取角色的unicode代码点

时间:2011-09-03 04:12:48

标签: python-2.7 unicode codepoint

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

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

5 个答案:

答案 0 :(得分:49)

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

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

将unicode转义码显示为源字符串。

答案 1 :(得分:34)

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

答案 2 :(得分:9)

通常,您只需ord(character)查找字符的代码点。但是为了完整性,Unicode Supplementary Multilingual Plane中的宽字符在窄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()

答案 3 :(得分:5)

结果证明这一点非常棘手:Python 2和Python 3在从字符串中提取Unicode代码点时会遇到一些微妙的问题。

直到Python 3.3,才有可能以两种模式之一编译Python:

  1. sys.maxunicode == 0x10FFFF
  2. 在此模式下,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
    2. 在此模式下,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字符串转换为代码点列表或从代码点列表转换来解决问题,而不管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'
      

答案 4 :(得分:0)

python2

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