Python url编码/解码将%转义的十六进制数字转换为字符串

2024-05-29 11:01:17 发布

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

例如,如果我有一个编码字符串:

url='locality=Norwood&address=138+The+Parade&region=SA&country=AU&name=Pav%C3%A9+cafe&postalCode=5067'

name参数包含字符%C3%A9,这实际上意味着字符é。在

因此,我希望输出为:

^{pr2}$

我在Python终端上尝试了以下步骤:

>>> import urllib2
>>> url='locality=Norwood&address=138+The+Parade&region=SA&country=AU&name=Pav%C3%A9+cafe&postalCode=5067'
>>> new_url=urllib2.unquote(url).decode('utf8')
>>> print new_url
locality=Norwood&address=138+The+Parade&region=SA&country=AU&name=Pavé+cafe&postalCode=5067
>>>

但是,当我在Python脚本中尝试相同的操作并运行为myscript.py,我正在获取以下堆栈跟踪:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 88: ordinal not in range(128)

我使用的是python2.6.6,由于工作原因无法切换到其他版本。在

我怎样才能克服这个错误?在

非常感谢任何帮助。提前谢谢!在

######################################################

编辑

我意识到我得到了上述预期的输出。

但是我希望将新url中的参数转换成字典,如下所示。这样做时,我无法在name参数中保留特殊字符'e'。在

print new_url
params_list = new_url.split("&")
print(params_list)
params_dict={}
for p in params_list:
   temp = p.split("=")
   params_dict[temp[0]] = temp[1]
print(params_dict)

输出:

新网址

locality=Norwood&address=138+The+Parade®ion=SA&country=AU&name=Pavé+cafe&postalCode=5067

参数列表

[u'locality=Norwood',u'address=138+The+Parade',u'region=SA',u'country=AU',u'name=Pav\xe9+cafe',u'postalCode=5067']

参数

{u'name':u'Pav\xe9+cafe',u'locality':u'Norwood',u'country':u'AU',u'region':u'SA',u'address':u'138+游行队伍,u'postalCode':u'5067'}

基本上。。。名称现在是“Pav\xe9+cafe”,而不是必需的“Pavé”。在

我怎样才能在我的情书中保留同样的特殊字符?在


Tags: thenameurlcafeaddresssaparamscountry
1条回答
网友
1楼 · 发布于 2024-05-29 11:01:17

这实际上是由于__repr__和{}之间的差异。当打印unicode字符串时,__str__将被使用,并导致打印new_url时看到的é。但是,当打印列表或dict时,__repr__被使用,它对列表和dict中的每个对象使用__repr__。如果您单独打印项目,它们将按您的需要打印。在

# -*- coding: utf-8 -*-
new_url = u'name=Pavé+cafe&postalCode=5067'
print(new_url)  # name=Pavé+cafe&postalCode=5067

params_list = [s for s in new_url.split("&")]
print(params_list)  # [u'name=Pav\xe9+cafe', u'postalCode=5067']
print(params_list[0])  # name=Pavé+cafe
print(params_list[1])  # postalCode=5067

params_dict = {}
for p in params_list:
    temp = p.split("=")
    params_dict[temp[0]] = temp[1]
print(params_dict)  # {u'postalCode': u'5067', u'name': u'Pav\xe9+cafe'}
print(params_dict.values()[0])  # 5067
print(params_dict.values()[1])  # Pavé+cafe

打印列表和dict的一种方法是获取它们的字符串表示形式,然后用unicode-escape对它们进行解码:

^{pr2}$

注意:这只是Python2中的一个问题。Python3按您的预期打印字符。另外,您可能需要查看^{}来解析您的URL,而不是手动进行解析。在

import urlparse
new_url = u'name=Pavé+cafe&postalCode=5067'
print dict(urlparse.parse_qsl(new_url))  # {u'postalCode': u'5067', u'name': u'Pav\xe9 cafe'}

相关问题 更多 >

    热门问题