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?我找到的答案要么处理&amp;#,要么需要eval(),这对我来说太慢了。对于任何包含此类序列的文本,我都需要一个通用的解决方案。

编辑: &lt;\a&gt; 是一个错字,但我也希望能容忍这种错字。应该只对\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。 &lt;\a&gt; 也不是有效的 html... 你的字符串包含\a而不是\\a这一事实强烈表明这是不可能的——你如何区分“我想要\u0441描述的字符实体” i> from "我想要6个字符的序列\u0441" 我认为&lt;\a&gt; 是一个错字 这是你想要的字符串吗...'&lt;a href = "http://www.mypage.com/\xd1\x81andmoretext"&gt;\xc2\xb2&lt;/a&gt;' 【参考方案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'&lt;a href = "http://www.mypage.com/\u0441andmoretext"&gt;\xb2&lt;\x07&gt;' 这对 OP 来说是个坏消息——这意味着唯一可行的解​​决方案是正则表达式 - 替换解析。

以上是关于Python 2.7:如何将字符串中的 unicode 转义转换为实际的 utf-8 字符的主要内容,如果未能解决你的问题,请参考以下文章

Pandas - Python 2.7:如何将时间序列索引转换为一天中的秒数?

如何将关键字参数添加到 Python 2.7 中的包装函数?

Python中的反射:如何在Python 2.7中查看函数的所有参数

如何使用python 2.7通过变量写入文本文件[重复]

将 python 2.7 timedelta.total_seconds() 转换为 python 2.6 中的等价物

有效地将字符串转换为 python 2.7 的 unicode