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

9
让我们以字符拉丁大写字母Ogonek(U+0104)为例。
我有一个int,表示它的UTF-8编码形式:
my_int = 0xC484
# Decimal: `50308`
# Binary: `0b1100010010000100`

如果使用unichr函数,我得到的结果是:\uC484 或者 (U+C484)。但是,我需要输出:Ą。如何将my_int转换为Unicode代码点?

2
有趣的问题。不过我很好奇会产生UTF-8整数的API是什么类型呢? - Cameron
3个回答

3
为了将整数0xC484转换为字节串'\xc4\x84'(Unicode字符Ą的UTF-8表示),您可以使用struct.pack()函数:
>>> import struct
>>> struct.pack(">H", 0xC484)
'\xc4\x84'

...其中>格式字符串中表示大端,而H表示无符号短整型

一旦您拥有了UTF-8字节串,就可以像往常一样解码为Unicode:

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

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

2
utf-8编码可以使用不同数量的字节来编码不同的Unicode代码点(从一个字节到4个字节)。 '>H' 仅适用于2字节序列。 - jfs

1
将数字编码为十六进制字符串,使用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')

如果第一个字节在0x1-0xF范围内,len检查将会确保它不会丢失前导零。这应该能够处理任何长度的字符串和任何字符(但是像这样在整数中编码字节序列将无法保留前导零字节)。

1
>>> int2bytes(0xC484).decode('utf-8')
u'\u0104'
>>> print(_)
Ą

在这里定义了int2bytes()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接