gpt4 book ai didi

python - wsgi - 处理来自帖子的unicode字符

转载 作者:太空宇宙 更新时间:2023-11-04 01:38:21 27 4
gpt4 key购买 nike

python 2.7

raw = '%C3%BE%C3%A6%C3%B0%C3%B6' #string from wsgi post_data
raw_uni = raw.replace('%', r'\x')
raw_uni # gives '\\xC3\\xBE\\xC3\\xA6\\xC3\\xB0\\xC3\\xB6'
print raw uni #gives '\xC3\xBE\xC3\xA6\xC3\xB0\xC3\xB6'
uni = unicode(raw_uni, 'utf-8')
uni #gives u'\\xC3\\xBE\\xC3\\xA6\\xC3\\xB0\\xC3\\xB6+\\xC3\\xA9g'
print uni #gives \xC3\xBE\xC3\xA6\xC3\xB0\xC3\xB6+\xC3\xA9g

但是,如果我将 raw_uni 更改为:

raw_uni = '\xC3\xBE\xC3\xA6\xC3\xB0\xC3\xB6'

现在做:

uni = unicode(raw_uni, 'utf-8')
uni #gives u'\xfe\xe6\xf0\xf6'
print uni #gives þæðö

这就是我想要的。

我如何去掉 raw_uni 中的这个额外的 '\' 或利用它只存在于字符串的 repr 版本中这一事实?更重要的是,为什么 unicode(raw_uni, 'utf-8') 使用字符串的 repr 版本???

谢谢

最佳答案

您应该使用 urllib.unquote,而不是手动替换:

>>> import urllib
>>> raw = '%C3%BE%C3%A6%C3%B0%C3%B6'
>>> urllib.unquote(raw)
'\xc3\xbe\xc3\xa6\xc3\xb0\xc3\xb6'
>>> unicode(urllib.unquote(raw), 'utf-8')
u'\xfe\xe6\xf0\xf6'

这里的根本问题是您对什么是十六进制转义有根本性的误解。不可打印字符的 repr 可以表示为十六进制转义,看起来像一个反斜杠,后跟一个“x”,然后是两个十六进制字符。这也是将这些字符键入字符串文字的方式,但它仍然只是一个字符。您的 replace 行不会将您的原始字符串转换为十六进制转义符,它只是将每个“%”替换为文字反斜杠字符后跟一个“x”。

考虑以下示例:

>>> len('\xC3')         # this is a hex escape, only one character
1
>>> len(r'\xC3') # this is four characters, '\', 'x', 'C', '3'
4
>>> r'\xC3' == '\\xC3' # raw strings escape backslashes
True

如果由于某种原因你不能使用 urllib.unquote,下面的方法应该有效:

raw_uni = re.sub('%(\w{2})', lambda m: chr(int(m.group(1), 16)), raw)

关于python - wsgi - 处理来自帖子的unicode字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7558758/

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