如何将表示 UTF-8 字符的 int 转换为 Unicode 代码点?

Posted

技术标签:

【中文标题】如何将表示 UTF-8 字符的 int 转换为 Unicode 代码点?【英文标题】:How do I convert an int representing a UTF-8 character into a Unicode code point? 【发布时间】:2015-05-30 04:56:33 【问题描述】:

让我们以字符Latin Capital Letter a with Ogonek (U+0104)为例。

我有一个表示其 UTF-8 编码形式的 int:

my_int = 0xC484
# Decimal: `50308`
# Binary: `0b1100010010000100`

如果使用unichr 函数,我会得到:\uC484 (U+C484)

但是,我需要它来输出:Ą

如何将my_int 转换为 Unicode 代码点?

【问题讨论】:

有趣的问题。不过,我很好奇哪种 API 会产生 UTF-8 整数? 相关:Convert a Python int into a big-endian string of bytes 【参考方案1】:

要将整数0xC484 转换为字节串'\xc4\x84'(Unicode 字符Ą 的UTF-8 表示),可以使用struct.pack()

>>> import struct
>>> struct.pack(">H", 0xC484)
'\xc4\x84'

... 其中format string 中的> 代表big-endianH 代表unsigned short int

一旦有了 UTF-8 字节串,就可以照常将其解码为 Unicode:

>>> struct.pack(">H", 0xC484).decode("utf8")
u'\u0104'

>>> print struct.pack(">H", 0xC484).decode("utf8")
Ą

【讨论】:

utf-8 编码可以使用不同的字节数来编码不同的 Unicode 代码点(从一个字节到 4 个字节)。 '>H' 仅适用于 2 字节序列。【参考方案2】:
>>> int2bytes(0xC484).decode('utf-8')
u'\u0104'
>>> print(_)
Ą

int2bytes() is defined here.

【讨论】:

【参考方案3】:

使用hex()%x 将数字编码为十六进制字符串。然后您可以使用hex 解码器将其解释为一系列十六进制字节。最后使用utf-8解码器得到一个unicode字符串:

def weird_utf8_integer_to_unicode(n):
    s= '%x' % n
    if len(s) % 2:
        s= '0'+s
    return s.decode('hex').decode('utf-8')

len 检查是为了防止第一个字节在 0x1–0xF 范围内,这会导致它缺少前导零。这应该能够处理任何长度的字符串和任何字符(但是像这样以整数编码字节序列将无法保留前导零字节)。

【讨论】:

以上是关于如何将表示 UTF-8 字符的 int 转换为 Unicode 代码点?的主要内容,如果未能解决你的问题,请参考以下文章

ASCII与字符的转换

用C++如何将一个整数转换成一个IP地址?

如何将 utf-8 花式引号转换为中性引号

C语言如何将int类型转换成字符串

Python - 如何将 int 转换为表示 32 位十六进制数的字符串

如何将表示为字符串的数字转换为浮点数