Python 2.7:如何将字符串中的 unicode 转义转换为实际的 utf-8 字符
Posted
技术标签:
【中文标题】Python 2.7:如何将字符串中的 unicode 转义转换为实际的 utf-8 字符【英文标题】:Python 2.7: How to convert unicode escapes in a string into actual utf-8 characters 【发布时间】:2015-06-30 13:47:55 【问题描述】:我使用 python 2.7 并且我正在从服务器接收 字符串(不是 unicode!)。 在该字符串中,我找到带有 unicode 转义序列的文本。比如这样:
<a href = "http://www.mypage.com/\u0441andmoretext">\u00b2<\a>
如何将那些 \uxxxx
- 转换回 utf-8?我找到的答案要么处理&#
,要么需要eval()
,这对我来说太慢了。对于任何包含此类序列的文本,我都需要一个通用的解决方案。
编辑:
<\a>
是一个错字,但我也希望能容忍这种错字。应该只对\u
有反应
示例文本使用正确的 Python 语法,如下所示:
"<a href = \"http://www.mypage.com/\\u0441andmoretext\">\\u00b2<\\a>"
所需的输出是正确的python语法
"<a href = \"http://www.mypage.com/\xd1\x81andmoretext\">\xc2\xb2<\\a>"
【问题讨论】:
你试过str.encode('utf-8')
吗?这会将字符串转换为 unicode。
<\a>
也不是有效的 html...
你的字符串包含\a
而不是\\a
这一事实强烈表明这是不可能的——你如何区分“我想要\u0441
描述的字符实体” i> from "我想要6个字符的序列\u0441
"
我认为<\a>
是一个错字
这是你想要的字符串吗...'<a href = "http://www.mypage.com/\xd1\x81andmoretext">\xc2\xb2</a>'
【参考方案1】:
试试
>>> s = "<a href = \"http://www.mypage.com/\\u0441andmoretext\">\\u00b2<\\a>"
>>> s.decode("raw_unicode_escape")
u'<a href = "http://www.mypage.com/\u0441andmoretext">\xb2<\\a>'
然后你可以像往常一样编码为utf8。
【讨论】:
看起来更像我正在寻找的东西。由于某种原因,它仍然没有转换 \\u0441(因为它不适合你)【参考方案2】:对于这种情况,Python 确实包含一些特殊的字符串编解码器。
在这种情况下,如果在 32-127 范围之外没有其他字符,您可以使用“unicode_escape”编解码器安全地解码您的字节字符串,以便在 Python 中拥有正确的 Unicode 文本对象。 (您的程序应该在其上执行所有文本操作) - 每当您再次输出该文本时,您都会像往常一样将其转换为 utf-8:
rawtext = r"""<a href="http://www.mypage.com/\u0441andmoretext">\u00b2<\a>"""
text = rawtext.decode("unicode_escape")
# Text operations go here
...
output_text = text.encode("utf-8")
如果存在 32-127 范围之外的其他字节,则 unicode_escape 编解码器 假设它们采用 latin1 编码。因此,如果您的响应混合了 utf-8 和这些 \uXXXX 序列,您必须:
-
使用 utf-8 解码原始字符串
编码回 latin1
使用“unicode_escape”解码
处理文本
编码回 utf-8
【讨论】:
这也转换了"\\a"
,我认为OP希望它保持原样。我得到text = u'<a href = "http://www.mypage.com/\u0441andmoretext">\xb2<\x07>'
这对 OP 来说是个坏消息——这意味着唯一可行的解决方案是正则表达式 - 替换解析。以上是关于Python 2.7:如何将字符串中的 unicode 转义转换为实际的 utf-8 字符的主要内容,如果未能解决你的问题,请参考以下文章
Pandas - Python 2.7:如何将时间序列索引转换为一天中的秒数?
如何将关键字参数添加到 Python 2.7 中的包装函数?
Python中的反射:如何在Python 2.7中查看函数的所有参数