在Python中发送非ASCII POST请求?
我想发送一个POST请求到一个web应用程序。我正在使用机械化模块(本身是urllib2的包装)。无论如何,当我尝试发送POST请求时,我得到了UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128)
。我试图把unicode(string)
的unicode(string, encoding="utf-8")
,unicode(string).encode()
等,没有什么工作 - 无论是返回的错误之上,或TypeError: decoding Unicode is not supported
在Python中发送非ASCII POST请求?
我看了看其他的SO回答类似的问题,但没有帮助。
在此先感谢!
编辑:其所产生的错误:
prda = "šđćč" #valid UTF-8 characters
prda # typing in python shell
'\xc5\xa1\xc4\x91\xc4\x87\xc4\x8d'
print prda # in shell
šđćč
prda.encode("utf-8") #in shell
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128)
unicode(prda)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128)
我假设你正在使用Python 2.x版本
给出一个Unicode对象:使用UTF-8
myUnicode = u'\u4f60\u597d'
对其进行编码:
mystr = myUnicode.encode('utf-8')
请注意,您需要明确指定编码。默认情况下它会(通常)使用ascii。
感谢您的答复。如果我有一个字符串变量(而不是字符串),我会如何将它转换为一个unicode对象?它深深嵌入代码中,以便在分配字符串变量之前简单地添加'u''前缀。 – 2012-01-08 00:30:10
你不需要来包装你在字符来电unicode
,因为他们已经编码:)如果有的话,你需要DE -code它得到一个Unicode对象:
>>> s = '\xc5\xa1\xc4\x91\xc4\x87\xc4\x8d' # your string
>>> s.decode('utf-8')
u'\u0161\u0111\u0107\u010d'
>>> type(s.decode('utf-8'))
<type 'unicode'>
我不知道mechanize
,所以我不知道它是否正确处理它,恐怕。
我会用常规urllib2
POST调用做什么,是使用urlencode
:
>>> from urllib import urlencode
>>> postData = urlencode({'test': s }) # note I'm NOT decoding it
>>> postData
'test=%C5%A1%C4%91%C4%87%C4%8D'
>>> urllib2.urlopen(url, postData) # etc etc etc
在你的榜样,您使用非Unicode字符串常量,其中包含非ASCII字符,这会导致prda
成为字节字符串。
为了达到这个目的,python使用sys.stdin.encoding
来自动编码字符串。在你的情况下,这意味着字符串被编码为“utf-8”。
要prda
转换为的unicode对象,则需要使用适当的编码进行解码:
>>> print prda.decode('utf-8')
šđćč
需要注意的是,在脚本或模块,可以不依赖于蟒蛇自动猜测编码 - 你需要明确delare编码在文件的顶部,就像这样:
# -*- coding: utf-8 -*-
每当你在Python 2碰到unicode的错误,这是非常往往是因为你的代码将字节字符串与unicode字符串混合。因此,您应该始终使用type(string)
来检查导致错误的字符串类型。
如果字符串对象是<type 'str'>
,但你需要unicode,解码它使用适当的编码。如果字符串对象是<type 'unicode'>
,但你需要字节,编码它使用适当的编码。
如果您展示了一个产生错误的小型自包含示例,我会提供帮助。 – ekhumoro 2012-01-07 23:46:01
@ekhumoro补充的例子,希望它清除它 – 2012-01-08 00:37:42