如何从 Python 3 中的 UTF-16 代码点获取字符?

How to get a character from its UTF-16 code points in Python 3?

我有一个 UTF-16 代码点列表,我需要将其转换为它们以编程方式表示的实际字符。这在 Python 3.

中似乎很难做到

例如,我有一个字符的数字 55357 和 56501,我知道这是这张钞票表情符号:但我不知道如何在 Python 中转换它。我首先尝试 chr(55357) + chr(56501),但 Python 似乎假设它是 UTF-8 编码的,因此给了我损坏的 Unicode。

然后我尝试重新编码字符串,但由于它是损坏的 UTF-8,它给我的似乎是损坏的 UTF-16。如果我告诉它不用 (chr(55357) + chr(56501)).encode('utf-8', 'surrogatepass'),我实际上可以获得该字符的有效字节,但它被编码为...CESU-8,原因我还不能理解。这不是 Python 原生支持的编码,我找不到可以转换它的编解码器。

我想我可以将它们写入磁盘,然后用正确的编码读取它们,但这听起来真的很糟糕。

在 Python 3 中是否有合理的方法来做到这一点?

以下代码有效:

cp1 = 55357
cp2 = 56501
(chr(cp1) + chr(cp2)).encode('utf-16', 'surrogatepass').decode('utf-16')
#

诀窍不是弄乱 chr 而是转换为字节数组,然后您可以将其解码为字符串:

a, b = 55357, 56501
x = a.to_bytes(2, 'little') + b.to_bytes(2, 'little')

print(x.decode('UTF-16'))

这可以推广到任意数量的整数:

data = [55357, 56501]
b = bytes([x for c in data for x in c.to_bytes(2, 'little')])
result = b.decode('utf-16')

chr(55357) + chr(56501) 之类的东西不起作用的原因是 chr 假定没有编码。它适用于原始 Unicode 代码点,因此您可以组合两个不同的字符。正如另一个答案指出的那样,您必须对这两个字符串进行编码并重新解码,或者按照我的建议获取字节并解码一次。