如何在Python中将代理项对转换为普通字符串? [英] How can I convert surrogate pairs to normal string in Python?
本文介绍了如何在Python中将代理项对转换为普通字符串?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这是Converting to Emoji的后续内容。在这个问题中,OP有一个json.dumps()
编码的文件,其中一个表情符号表示为一个代理对-ud83dude4f
。他/她在读取文件和正确翻译表情符号时遇到问题,正确的answer是json.loads()
文件中的每一行,json
模块将处理从代理项对返回到(我假设是UTF8编码的)表情符号的转换。
我的情况是这样的:假设我只有一个带有代理项对的常规Python3 Unicode字符串:
emoji = "This is ud83dude4f, an emoji."
如何处理此字符串以从中获取emoji的表示形式?我希望得到这样的东西:
"This is 🙏, an emoji."
# or
"This is U0001f64f, an emoji."
我已尝试:
print(emoji)
print(emoji.encode("utf-8")) # also tried "ascii", "utf-16", and "utf-16-le"
json.loads(emoji) # and `.encode()` with various codecs
通常我会收到类似于UnicodeEncodeError: XXX codec can't encode character 'ud83d' in position 8: surrogates no allowed
的错误。
$LANG
设置为en_US.UTF-8
。我在命令行上的Python解释器中和在Sublime Text中运行的IPython中都运行过这些示例,它们似乎没有任何区别。
推荐答案
您在磁盘上的JSON文件中混合了一个文字字符串ud83d
(六个字符: u d 8 3 d
)和内存中的一个单个字符u'ud83d'
(在Python源代码中使用字符串文字指定)。这就是在Python3上len(r'ud83d') == 6
和len('ud83d') == 1
的区别。
如果您看到'ud83dude4f'
Python字符串(2个字符),则表示上游存在错误。通常情况下,你不应该得到这样的字符串。如果您获得一个错误,但不能修复生成它的上游错误;您可以使用surrogatepass
错误处理程序修复它:
>>> "ud83dude4f".encode('utf-16', 'surrogatepass').decode('utf-16')
'🙏'
注意:即使您的json文件包含文字ud83dude4f(12字符),也不应获得代理项对:
>>> print(ascii(json.loads(r'"ud83dude4f"')))
'U0001f64f'
注意:结果是1字符('U0001f64f'
),而不是代理项对('ud83dude4f'
)。
这篇关于如何在Python中将代理项对转换为普通字符串?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文