我正在使用Robot框架来自动执行一些与HTTP POST相关的测试。我编写了一个自定义Python库,它具有执行HTTP POST的功能。它看起来像这样:
# This function will do a http post and return the json response
def Http_Post_using_python(json_dict,url):
post_data = json_dict.encode('utf-8')
headers = {}
headers['Content-Type'] = 'application/json'
h = httplib2.Http()
resp, content = h.request(url,'POST',post_data,headers)
return resp, content
只要我不使用任何Unicode字符,这都可以正常工作。当我在json_dict
变量中有Unicode字符时(例如,메시지),它会因此错误而失败:
UnicodeDecodeError:'ascii'编解码器无法解码164位的字节0xeb:序号不在范围内(128)
我在Windows 7上运行Python 2.7.3。我看到了几个相关问题,但我无法解决问题。我是Python和编程的新手,所以感谢任何帮助。
感谢。
答案 0 :(得分:2)
您收到此错误是因为json_dict
是str
,而不是unicode
。在不了解应用程序的任何其他内容的情况下,一个简单的解决方案是:
if isinstance(json_dict, unicode):
json_dict = json_dict.encode("utf-8")
post_data = json_dict
但是,如果您使用json.dumps(…)
创建json_dict
,则无需对其进行编码 - 这将由json.dumps(…)
完成。
答案 1 :(得分:1)
使用requests
:
requests.post(url, data=data, headers=headers)
它会处理你的编码。
由于Python 2的自动编码/解码,你得到一个错误,这基本上是一个错误,并在Python 3中修复。简而言之,Python 2的str
对象实际上是“字节”,右边处理字符串数据的方法是在unicode
对象中。由于unicode
s之后被引入,Python 2会在它们混淆时自动尝试在它们和字符串之间进行转换。为此,它需要知道编码;因为你没有指定一个,所以它默认为ascii
,它没有所需的字符。
为什么Python会自动尝试为您解码?因为您在.encode()
对象上调用了str
。它已经编码,因此Python首先尝试为您解码,并猜测ascii
编码。
答案 2 :(得分:-3)
试试这个:
#coding=utf-8
test = "메시지"
test.decode('utf8')
在#coding=utf-8
行中,我只是将文件编码设置为UTF-8(以便能够编写“메시지”)。
您需要将字符串解码为utf-8。 decode method documentation