gpt4 book ai didi

python混合单双unicode转义序列

转载 作者:行者123 更新时间:2023-11-28 22:00:59 28 4
gpt4 key购买 nike

我对奇怪的转义 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'

服务器的响应看起来像这样:

\u003c? abc ?\u003eDas Modell des Adaptiven Zyklus wurde aus vergleichenden Untersuchungen zur Dynamik von Ökosystemen abgeleitet.\u003c?dpf /sent ?\u003e

问题是双重转义的 unicode 序列,如\u003c,\u003c 通常表示 < 字符。\xd6 是正确的,代表德语 Ö。这种双重转义完全弄乱了我的 unicode 字符串:-)

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

使用 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 ?>

尝试使用 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)

这个正则表达式将解码任何 \uxxxx 匹配到它的 unicode 字符等价物,前提是它前面没有 \,它有效地逃避了转义; \\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 ?>

关于python混合单双unicode转义序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13918093/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com