如何在Python中将代理项对转换为普通字符串? [英] How can I convert surrogate pairs to normal string in Python?

查看:17
本文介绍了如何在Python中将代理项对转换为普通字符串?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是Converting to Emoji的后续内容。在这个问题中,OP有一个json.dumps()编码的文件,其中一个表情符号表示为一个代理对-ud83dude4f。他/她在读取文件和正确翻译表情符号时遇到问题,正确的answerjson.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的错误。

我在Linux上运行的是Python3.5.1,$LANG设置为en_US.UTF-8。我在命令行上的Python解释器中和在Sublime Text中运行的IPython中都运行过这些示例,它们似乎没有任何区别。

推荐答案

您在磁盘上的JSON文件中混合了一个文字字符串ud83d(六个字符: u d 8 3 d)和内存中的一个单个字符u'ud83d'(在Python源代码中使用字符串文字指定)。这就是在Python3上len(r'ud83d') == 6len('ud83d') == 1的区别。

如果您看到'ud83dude4f'Python字符串(2个字符),则表示上游存在错误。通常情况下,你不应该得到这样的字符串。如果您获得一个错误,但不能修复生成它的上游错误;您可以使用surrogatepass错误处理程序修复它:

>>> "ud83dude4f".encode('utf-16', 'surrogatepass').decode('utf-16')
'🙏'

Python 2 was more permissive

注意:即使您的json文件包含文字ud83dude4f(12字符),也不应获得代理项对:

>>> print(ascii(json.loads(r'"ud83dude4f"')))
'U0001f64f'

注意:结果是1字符('U0001f64f'),而不是代理项对('ud83dude4f')。

这篇关于如何在Python中将代理项对转换为普通字符串?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆