python混合了单和双unicode转义序列

2024-09-30 08:22:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我对奇怪的转义unicode字符串有一些问题。我的脚本通过请求库和响应.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'

服务器的响应如下所示:

^{pr2}$

问题是像\u003c这样的双转义unicode序列,\u003c通常表示一个<;字符。\xd6是正确的,代表一个德国人。这个双转义完全弄乱了我的unicode字符串:-)

我在这篇文章中发现了类似的问题: Stack Overflow - Conversion of strings like \uXXXX in python

解决方案,使用字符串.解码('unicode-escape'),只有当所有unicode序列都将被转义,而不是使用单转义和双转义的混合转义时,它才有效。只需将双转义替换为单转义,就会得到一个损坏的unicode字符串。在

最简单最好的解决方案是在服务器端调整响应编码,但是我没有权限。。。在

谢谢你的帮助!!!在


Tags: of字符串text脚本lenwithunicode序列
1条回答
网友
1楼 · 发布于 2024-09-30 08:22:12

我怀疑服务器正在返回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 ?>

尝试使用json.loads('"{0}"'.format(response.content))解码对Unicode的响应。在

您的更新版本确实包含引号,这有点麻烦,因为要在有效的JSON中使用,这些引号必须被转义。那么它可能不是JSON,而是其他形式的转义;Java和Ruby也使用\uxxxx转义符。下一步我们可以尝试使用正则表达式来替换:

^{pr2}$

此正则表达式将解码任何与它的unicode字符等价的\uxxxx,前提是它前面没有\,它有效地转义;\\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 ?>

相关问题 更多 >

    热门问题