Python 2.7:如何将字符串中的Unicode转义序列转换为实际的UTF-8字符

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

你尝试过使用 str.encode('utf-8') 吗?这会将字符串转换为 Unicode。 - Matthew
你想要做什么? - Padraic Cunningham
1
你的字符串包含\a而不是\\a,这强烈暗示着这是不可能的 - 你如何区分“我想要由\u0441描述的字符实体”和“我想要由6个字符\u0441组成的序列”? - Eric
1
我认为 <\a> 是一个打字错误。 - Paulo Bu
1
这是你想要的字符串吗... '<a href = "http://www.mypage.com/\xd1\x81andmoretext">\xc2\xb2</a>' - Shashank
显示剩余4条评论
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。


1
看起来更像我在寻找的东西。出于某种原因,它仍然无法转换\u0441(就像对您一样)。 - evolution

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序列,则需要执行以下操作:
  1. 使用utf-8解码原始字符串
  2. 重新编码为latin1
  3. 使用"unicode_escape"进行解码
  4. 处理文本
  5. 重新编码为utf-8

这也将转换"\\a",而我认为OP希望它保持不变。我得到text = u'<a href = "http://www.mypage.com/\u0441andmoretext">\xb2<\x07>' - Ella Sharakanski
1
这对OP来说是一个非常不好的消息 - 这意味着唯一可行的解决方案将是正则表达式替换解析。 - jsbueno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接