【问题标题】:How to get a character from its UTF-16 code points in Python 3?如何从 Python 3 中的 UTF-16 代码点获取字符?
【发布时间】:2019-02-12 06:56:24
【问题描述】:

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

【问题讨论】:

    标签: python python-3.x utf-16


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      以下代码有效:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-07
        • 2021-06-10
        • 1970-01-01
        相关资源
        最近更新 更多