1

我正在使用 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 和编程的新手,因此不胜感激。

谢谢。

4

3 回答 3

2

您收到此错误是因为json_dictis a str,而不是unicode. 在不了解有关应用程序的任何其他信息的情况下,一个简单的解决方案是:

if isinstance(json_dict, unicode):
    json_dict = json_dict.encode("utf-8")
post_data = json_dict

但是,如果您json.dumps(…)用于创建json_dict,那么您不需要对其进行编码 - 这将由json.dumps(…).

于 2012-11-20T21:04:26.300 回答
1

使用requests

requests.post(url, data=data, headers=headers)

它将为您处理编码。


由于 Python 2 的自动编码/解码,您会遇到错误,这基本上是一个错误,并在 Python 3 中得到了修复。简而言之,Python 2 的str对象实际上是“字节”,处理字符串数据的正确方法是在unicode目的。由于unicodes 是后来引入的,所以当你混淆它们时,Python 2 会自动尝试在它们和字符串之间进行转换。为此,它需要知道编码;由于您没有指定一个,它默认为ascii没有所需的字符。

为什么 Python 会自动尝试为您解码?因为你在调用.encode()一个str对象。它已经编码,因此 Python 首先尝试为您解码,并猜测ascii编码。


您应该阅读每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最低要求(没有借口!)

于 2012-11-20T21:04:42.203 回答
-3

尝试这个:

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

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

您需要将字符串解码为 utf-8。解码方法文档

于 2012-11-20T21:07:16.173 回答