4

我使用 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>"
4

2 回答 2

6

尝试

>>> 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。

于 2015-04-23T20:20:05.757 回答
1

对于这种情况,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 序列,您必须:

  1. 使用 utf-8 解码原始字符串
  2. 编码回 latin1
  3. 使用“unicode_escape”解码
  4. 处理文本
  5. 编码回 utf-8
于 2015-04-22T18:14:28.327 回答