这里给出的答案:How to work with surrogate pairs in Python?告诉您如何将代理项对(如'\ud83d\ude4f'转换为单个非BMP Unicode字符)(答案为"\ud83d\ude4f".encode('utf-16', 'surrogatepass').decode('utf-16'))。我想知道如何反向操作。如何使用python从非BMP字符中找到等效的代理项对,并将其转换回'\U0001f64f'()。我找不到一个明确的答案。

最佳答案

您必须用代理项对手动替换每个非BMP点。您可以使用正则表达式来执行此操作:

import re

_nonbmp = re.compile(r'[\U00010000-\U0010FFFF]')

def _surrogatepair(match):
    char = match.group()
    assert ord(char) > 0xffff
    encoded = char.encode('utf-16-le')
    return (
        chr(int.from_bytes(encoded[:2], 'little')) +
        chr(int.from_bytes(encoded[2:], 'little')))

def with_surrogates(text):
    return _nonbmp.sub(_surrogatepair, text)

演示:
>>> with_surrogates('\U0001f64f')
'\ud83d\ude4f'

07-28 10:34