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

SK9*_*SK9 44 unicode codepoint python-2.7

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

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

Kei*_*ith 52

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

>>> s='?'
>>> s.encode("unicode_escape")
b'\\u3232'
Run Code Online (Sandbox Code Playgroud)

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

  • 对我来说,这不适用于 ASCII 字符:`'a'.encode('unicode_escape')` 给出了 `a` 而不是 '\\u。(与 `u'a'.encode('unicode_escape')` 相同。)此外,当你离开基本多语言平面时,格式是不同的:`u''.encode('unicode_escape')` 给出了 `'\\ U0001f631'`。 (3认同)
  • 如果重要,我使用的是 Python 2.7。 (2认同)
  • @ShreevatsaR尝试使用“” a“ .encode(” unicode_escape“)。hex()`来获取十六进制表示形式为” str“。另外,`hex(ord(“ a”))`也将起作用。 (2认同)

Mik*_*ham 40

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • 当然,它可能会在最后打印出你的'101'和'u'\ u0301'769` ...... (2认同)
  • 看起来'ord()'做了我想要的:http://docs.python.org/library/functions.html#ord。谢谢。 (2认同)

cry*_*ryo 11

通常,您只需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)
Run Code Online (Sandbox Code Playgroud)

这在大多数应用程序中很少见,所以通常只是使用ord().

  • @JohnMachin:你很接近,但并不完全:代理对仍然只是一个代码点.这是两个代码单元. (3认同)

小智 6

事实证明,正确地做到这一点非常棘手: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']
Run Code Online (Sandbox Code Playgroud)

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

  1. 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']
Run Code Online (Sandbox Code Playgroud)

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

这种运行时差异使编写Python模块来处理Unicode字符串(作为一系列代码点)非常不便。

代码点模块

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

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'
Run Code Online (Sandbox Code Playgroud)


loo*_*ong 5

蟒蛇2

\n\n
>>> print hex(ord(u'\xe4\xba\xba'))\n0x4eba\n
Run Code Online (Sandbox Code Playgroud)\n