首页 > 解决方案 > 如何从 Python 3 中的 UTF-16 代码点获取字符?

问题描述

我有一个 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 中是否有合理的方法来做到这一点?

标签: pythonpython-3.xutf-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 代码点,因此您正在组合两个不同的字符。正如另一个答案指出的那样,您必须对这两个字符串进行编码并重新解码,或者按照我的建议只获取字节并解码一次。


推荐阅读