关于python:requests.post的头字段可以是unicode对象吗?

Can the header field of requests.post be a unicode object?

我正在使用python请求2.2.1,并尝试使用自定义标头发布请求。

我正在创建自己的标题myheader,如下所示:

1
myheader = {'name' : myvalue }

事情是myvalue是一个unicode对象。 我没有将它编码为字节字符串,只是将其直接放在myheader字典中。

当我这样做时:

1
r = requests.post(myhost, headers=myheader)

我得到一个例外:

1
UnicodeEncodeError: 'ascii' codec can't encode characters in position 17-18: ordinal not in range(128)

而且我想在将它放入header字典之前做myvalue.encode('utf8')可以摆脱它 - 但我的问题是,将unicode对象放入标题是不合法的吗? 我问,因为响应可以包含没有问题的unicode对象,那么为什么我不能在标题中放一个?


标题不是unicode数据,不是。 它们不是POST主体的一部分(根据需要为您编码,否则可以包含任何二进制数据)。

绝大多数HTTP标头编码的信息无论如何都只需要ASCII字符集。 例如,Accept-Language标头仅包含ISO-639语言代码,可选的ISO-3166国家/地区代码,以及q;=和数字信息。

通常认为HTTP标头也可能包含Latin-1(ISO-8859-1)字符(因此最多为Unicode U + 00FF); 特别是HTTP 1.1警告标头规范使用Latin-1作为默认值。 如果需要在Latin-1范围之外的标头中编码文本,请对RFC 2047之后的文本进行编码。在Python中,您可以使用email.header.Header()对象进行编码:

1
2
3
from email.header import Header

myheader = {'name': str(Header(u'Some unicode value', 'utf-8'))}