【发布时间】:2011-09-22 18:28:15
【问题描述】:
如果我有这样的对象:
d = {'a':1, 'en': 'hello'}
...那我可以传给urllib.urlencode,没问题:
percent_escaped = urlencode(d)
print percent_escaped
但如果我尝试传递一个类型为 unicode 的对象,游戏结束:
d2 = {'a':1, 'en': 'hello', 'pt': u'olá'}
percent_escaped = urlencode(d2)
print percent_escaped # This fails with a UnicodeEncodingError
所以我的问题是关于准备传递给urlencode 的对象的可靠方法。
我想出了这个函数,我只需遍历对象并编码字符串或 unicode 类型的值:
def encode_object(object):
for k,v in object.items():
if type(v) in (str, unicode):
object[k] = v.encode('utf-8')
return object
这似乎有效:
d2 = {'a':1, 'en': 'hello', 'pt': u'olá'}
percent_escaped = urlencode(encode_object(d2))
print percent_escaped
然后输出 a=1&en=hello&pt=%C3%B3la,准备好传递给 POST 调用或其他任何东西。
但我的 encode_object 函数对我来说看起来真的很不稳定。一方面,它不处理嵌套对象。
另一方面,我对 if 语句感到紧张。还有其他我应该考虑的类型吗?
并且正在将某些东西的type() 与本机对象进行比较,就像这种好习惯?
type(v) in (str, unicode) # not so sure about this...
谢谢!
【问题讨论】:
-
应该是
u'olá'而不是u'óla'... -
PortugueseEncodingError,对不起:) -
只是对你最后一句话的想法:应该是
if isinstance(v, unicode)而不是if type(v) in ...,也不需要匹配str,因为它不需要编码 -
谢谢,采纳您的建议。
-
我会讽刺地回答
sys.setdefaultencoding("utf-8"),但我担心我会失去我的所有代表并吊销我的python徽章。