使用Python获取字符的unicode代码点

发布于 2024-12-02 12:39:03 字数 95 浏览 2 评论 0原文

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

编辑:以防万一,我使用的是 Python 2.7。

In Python API, is there a way to extract the unicode code point of a single character?

Edit: In case it matters, I'm using Python 2.7.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

没企图 2024-12-09 12:39:03

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

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

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

If I understand your question correctly, you can do this.

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

Shows the unicode escape code as a source string.

污味仙女 2024-12-09 12:39:03
>>> 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
>>> 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
や莫失莫忘 2024-12-09 12:39:03

事实证明,要做到这一点相当棘手:Python 2 和 Python 3 在从字符串中提取 Unicode 代码点时存在一些微妙的问题。

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

  1. sys.maxunicode == 0x10FFFF

在这种模式下,Python 的 Unicode 字符串支持从 U+0000 到U+10FFFF。一个代码点由一个字符串元素表示:

>>> 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 的 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 字符串作为一系列代码点进行操作非常不方便。

<

为了解决这个问题,我向 PyPI 贡献了一个新模块 codepoints

a href="https://pypi.python.org/pypi/codepoints/1.0 " rel="noreferrer">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'

Turns out getting this right is fairly tricky: Python 2 and Python 3 have some subtle issues with extracting Unicode code points from a string.

Up until Python 3.3, it was possible to compile Python in one of two modes:

  1. sys.maxunicode == 0x10FFFF

In this mode, Python's Unicode strings support the full range of Unicode code points from U+0000 to U+10FFFF. One code point is represented by one string element:

>>> import sys
>>> hex(sys.maxunicode)
'0x10ffff'
>>> len(u'\U0001F40D')
1
>>> [c for c in u'\U0001F40D']
[u'\U0001f40d']

This is the default for Python 2.7 on Linux, as well as universally on Python 3.3 and later across all operating systems.

  1. sys.maxunicode == 0xFFFF

In this mode, Python's Unicode strings only support the range of Unicode code points from U+0000 to U+FFFF. Any code points from U+10000 through U+10FFFF are represented using a pair of string elements in the UTF-16 encoding::

>>> import sys
>>> hex(sys.maxunicode)
'0xffff'
>>> len(u'\U0001F40D')
2
>>> [c for c in u'\U0001F40D']
[u'\ud83d', u'\udc0d']

This is the default for Python 2.7 on macOS and Windows.

This runtime difference makes writing Python modules to manipulate Unicode strings as series of codepoints quite inconvenient.

The codepoints module

To solve this, I contributed a new module codepoints to PyPI:

https://pypi.python.org/pypi/codepoints/1.0

This module solves the problem by exposing APIs to convert Unicode strings to and from lists of code points, regardless of the underlying setting for 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'
酒中人 2024-12-09 12:39:03

通常,您只需执行 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() 即可。

Usually, you just do ord(character) to find the code point of a character. For completeness though, wide characters in the Unicode Supplementary Multilingual Plane are represented as surrogate pairs (i.e. two code units) in narrow Python builds, so in that case I often needed to do this small work-around:

def get_wide_ordinal(char):
    if len(char) != 2:
        return ord(char)
    return 0x10000 + (ord(char[0]) - 0xD800) * 0x400 + (ord(char[1]) - 0xDC00)

This is rare in most applications though, so normally just use ord().

Hello爱情风 2024-12-09 12:39:03

蟒蛇2

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

python2

>>> print hex(ord(u'人'))
0x4eba
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文