我有一些奇怪的逃脱unicode字符串的问题.我的脚本通过请求库使用web服务,response.text包含以下unicode字符串:
u'\\u003c? abc ?\\u003eDas Modell des Adaptiven Zyklus wurde aus vergleichenden Untersuchungen zur Dynamik von \xd6kosystemen abgeleitet.\\u003c? /abc ?\\u003e'
**Updated** Martijn solution works with the upper one, but breaks with this one because of len="12"
u'\\u003c?abc len="12"?\\u003eResilienz sollte als st\xe4ndiger Anpassungsprozess zwischen Systemen und der Umwelt begriffen werden.\\u003c? /abc ?\\u003e'
Run Code Online (Sandbox Code Playgroud)
服务器的响应如下所示:
\u003c? abc ?\u003eDas Modell des Adaptiven Zyklus wurde aus vergleichenden Untersuchungen zur Dynamik von Ökosystemen abgeleitet.\u003c?dpf /sent ?\u003e
Run Code Online (Sandbox Code Playgroud)
问题是双转义的unicode序列,如\ u003c,\ u003c通常代表<char.\ xd6是正确的,代表德国Ö.这个双重逃逸完全搞砸了我的unicode字符串:-)
我在这篇文章中发现了一个类似的问题: Stack Overflow - 在python中转换字符串如\ uXXXX
使用string.decode('unicode-escape')的解决方案似乎只有在所有unicode序列都被转义但没有混合的单转义和双转义时才能工作.用单个替换双重转义会给我一个损坏的unicode字符串.
最简单和最好的解决方案是在服务器端调整响应编码,但我无法访问...
谢谢你的帮助!!!
我怀疑服务器正在返回JSON字符串.JSON使用相同的转义序列,如果在字符串周围添加引号,json.loads()则非常乐意为您解码该示例:
>>> txt = u'\\u003c? abc ?\\u003eDas Modell des Adaptiven Zyklus wurde aus vergleichenden Untersuchungen zur Dynamik von \xd6kosystemen abgeleitet.\\u003c? /abc ?\\u003e'
>>> content = txt.encode('utf8')
>>> content
'\\u003c? abc ?\\u003eDas Modell des Adaptiven Zyklus wurde aus vergleichenden Untersuchungen zur Dynamik von \xc3\x96kosystemen abgeleitet.\\u003c? /abc ?\\u003e'
>>> import json
>>> json.loads('"{0}"'.format(content))
u'<? abc ?>Das Modell des Adaptiven Zyklus wurde aus vergleichenden Untersuchungen zur Dynamik von \xd6kosystemen abgeleitet.<? /abc ?>'
>>> print json.loads('"{0}"'.format(content))
<? abc ?>Das Modell des Adaptiven Zyklus wurde aus vergleichenden Untersuchungen zur Dynamik von Ökosystemen abgeleitet.<? /abc ?>
Run Code Online (Sandbox Code Playgroud)
尝试使用json.loads('"{0}"'.format(response.content))解码对Unicode的响应.
您的更新版本确实包含引号,有点令人烦恼,因为那些必须转义为使用有效的JSON.它可能不是JSON,而是一些其他形式的逃脱; Java和Ruby也使用\uxxxx转义.接下来我们可以尝试使用正则表达式来替换这些:
import re
uescapes = re.compile(r'(?<!\\)\\u[0-9a-fA-F]{4}', re.UNICODE)
def uescape_decode(match): return match.group().decode('unicode_escape')
uescapes.sub(uescape_decode, response.text)
Run Code Online (Sandbox Code Playgroud)
这个正则表达式将解码任何\uxxxx匹配它的unicode字符等价物,前提是它前面没有a \,它有效地逃脱了逃逸; \\uxxxx不会被取代.
正则表达式方法解码您的两个示例(第二次解码):
>>> print uescapes.sub(uescape_decode, txt)
<?abc len="12"?>Resilienz sollte als ständiger Anpassungsprozess zwischen Systemen und der Umwelt begriffen werden.<? /abc ?>
>>> print uescapes.sub(uescape_decode, u'\\u003c? abc ?\\u003eDas Modell des Adaptiven Zyklus wurde aus vergleichenden Untersuchungen zur Dynamik von \xd6kosystemen abgeleitet.\\u003c? /abc ?\\u003e')
<? abc ?>Das Modell des Adaptiven Zyklus wurde aus vergleichenden Untersuchungen zur Dynamik von Ökosystemen abgeleitet.<? /abc ?>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1469 次 |
| 最近记录: |