最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】Python中urllib.urlencode的时候出错:UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-2: ordinal not in range(128)

Python crifan 5952浏览 0评论

【问题】

在Python中,传递给urllib.urlencode一个Dict变量:

postData = urllib.urlencode(postDict);

但是结果出错:

Traceback (most recent call last):
File “E:\Dev_Root\python\BlogsToWordpress\HiBaiduToWordpress\HiBaiduToWordpress\HiBaiduToWordpress_v2012-03-12-home.py”, line 2850, in <module>
main()
File “E:\Dev_Root\python\BlogsToWordpress\HiBaiduToWordpress\HiBaiduToWordpress\HiBaiduToWordpress_v2012-03-12-home.py”, line 2755, in main
i = fetchEntry(permalink);
File “E:\Dev_Root\python\BlogsToWordpress\HiBaiduToWordpress\HiBaiduToWordpress\HiBaiduToWordpress_v2012-03-12-home.py”, line 1836, in fetchEntry
resp = getUrlResponse(modifyUrl, postDict);
File “E:\Dev_Root\python\BlogsToWordpress\HiBaiduToWordpress\HiBaiduToWordpress\HiBaiduToWordpress_v2012-03-12-home.py”, line 1556, in getUrlResponse
postData = urllib.urlencode(postDict);
File “E:\dev_install_root\Python27\lib\urllib.py”, line 1294, in urlencode
v = quote_plus(str(v))
UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-2: ordinal not in range(128)

【解决过程】

1.之前已经遇到类似问题,并且搞定过了:

【已解决】Python字符串处理出现错误:UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe6 in position 0: ordinal not in range(128)

结果此处又遇到这类问题。真是被python中的编码问题搞得无语了。

2.看了下现象,貌似又是传入的字符,不支持,所以,去代码中,把传入的几个包含了中文的变量:

gVal[‘newPostPatStr’] ,postDict[‘category’] ,postDict[‘titleName’] ,

都检查一遍,都确保是Unicode,这样,按理来说,unicode类型的字符,应该支持了吧。

结果还是出错。

3.也尝试过:

postData = urllib.urlencode(postDict, True);

但是编码后的数据,所有的中文,都是变成了%3F,明显不是所想要的。

4.后来折腾了半天,试了试:

gVal['newPostPatStr'] = gVal['newPostPatStr'].encode("utf-8");
postDict['category'] = postDict['category'].encode("utf-8");
postDict['titleName'] = postDict['titleName'].encode("utf-8");

虽然可以运行通过,但是得到的结果,不是所期望的,比如

期望“任何人”这三个中文字符,编码后为:%C8%CE%BA%CE%C8%CB,但是却得到了%E4%BB%BB%E4%BD%95%E4%BA%BA。

5.后来经过折腾,这样就可以了:

gVal['newPostPatStr'] = gVal['newPostPatStr'].encode("GB18030");
postDict['category'] = postDict['category'].encode("GB18030");
postDict['titleName'] = postDict['titleName'].encode("GB18030");

原因在于,我此处的是希望得到GBK(GB18030)的中文字符编码后的结果,此处,传递给urllib.urlencode(的对应的key的value,也要是某种已经编码后的Unicode的字符,比如GB18030,而不能是Unicode本身。

并且,Unicode被编码为何种类型,是Utf-8还是GB18030,还是其他,则是针对自己的程序,要自己清楚用哪个。

【总结】

对于Python中的编码,真的被搞死了,遇到很多次这类错误了,结果还是不能完全避免以后再犯类似的错误。

因为不同的函数,貌似需要的参数和用法,都是需要完全搞懂的,万一遇到像urllib.urlencode的函数,没搞懂参数所需要的字符的编码类型,是Unicode还是Str,是Str的话,是Utf-8还是GB18030或其他,等等,都是要完全清楚,才不会出错的。

总之,以后用这类的函数,还是要很小心,才可以的。

转载请注明:在路上 » 【已解决】Python中urllib.urlencode的时候出错:UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-2: ordinal not in range(128)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
89 queries in 0.277 seconds, using 22.17MB memory