2012-01-07 102 views
5

我想发送一个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) 
+0

如果您展示了一个产生错误的小型自包含示例,我会提供帮助。 – ekhumoro 2012-01-07 23:46:01

+0

@ekhumoro补充的例子,希望它清除它 – 2012-01-08 00:37:42

回答

7

我假设你正在使用Python 2.x版本

给出一个Unicode对象:使用UTF-8

myUnicode = u'\u4f60\u597d' 

对其进行编码:

mystr = myUnicode.encode('utf-8') 

请注意,您需要明确指定编码。默认情况下它会(通常)使用ascii。

+0

感谢您的答复。如果我有一个字符串变量(而不是字符串),我会如何将它转换为一个unicode对象?它深深嵌入代码中,以便在分配字符串变量之前简单地添加'u''前缀。 – 2012-01-08 00:30:10

0

你不需要来包装你在字符来电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 
1

在你的榜样,您使用非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'>,但你需要字节,编码它使用适当的编码。