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

时间:2019-02-12 06:56:25

标签: python python-3.x 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中有合理的方法吗?

2 个答案:

答案 0 :(得分:2)

以下代码有效:

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

答案 1 :(得分:2)

诀窍不是弄乱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代码点,因此您要组合两个不同的字符。正如其他答案所指出的那样,然后您必须对这两个字符串进行编码并重新解码,或者按照我的建议仅获取字节并解码一次。