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