使用我的Python函数解码错误

时间:2012-11-20 21:00:22

标签: python unicode

我正在使用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和编程的新手,所以感谢任何帮助。

感谢。

3 个答案:

答案 0 :(得分:2)

您收到此错误是因为json_dictstr,而不是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编码。


您应该阅读The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

答案 2 :(得分:-3)

试试这个:

#coding=utf-8
test = "메시지" 
test.decode('utf8')

#coding=utf-8行中,我只是将文件编码设置为UTF-8(以便能够编写“메시지”)。

您需要将字符串解码为utf-8。 decode method documentation