假如服务端是接受 GBK 编码,对于 python 3 来说,中文 POST 参数应这样写
```python 3
#requests (2.18.4)
'name': '先生'.encode('GBK'), # 生成 bytes 类型,而不要用 str。因为 str 会默认由 utf-8 编码。如果服务端也用 UTF-8 解码中文,应该不会有问题。
以下是models.py原文 在site-packages\requests 目录下
```python
def _encode_params(data):
"""Encode parameters in a piece of data.
Will successfully encode parameters when passed as a dict or a list of
2-tuples. Order is retained if data is a list of 2-tuples but arbitrary
if parameters are supplied as a dict.
"""
if isinstance(data, (str, bytes)):
return data
elif hasattr(data, 'read'):
return data
elif hasattr(data, '__iter__'):
result = []
for k, vs in to_key_val_list(data):
if isinstance(vs, basestring) or not hasattr(vs, '__iter__'):
vs = [vs]
for v in vs:
if v is not None:
result.append(
(k.encode('utf-8') if isinstance(k, str) else k,
v.encode('utf-8') if isinstance(v, str) else v))
return urlencode(result, doseq=True)
else:
return data
关键位置在于对 k,v 的处理,所以假如提供的是,b'\xcf\xc8\xc9\xfa' 这样的数据,会原样传给服务器。
但是假如服务器也是 UTF-8 处理中文,则完全不用这样。这样服务器接收到的 name 值就是'先生'.encode('utf-8') .也许是 b'\xe5\x85\x88\xe7\x94\x9f'。
然后它还要经过 urldecode 处理以后,再反向解析成中文字符串。就是你看到的这个样子'\xe5\x85\x88\xe7\x94\x9f' 这就是 name 参数的内存格式。
假如控制台只能接受和显示 GB2312、 要对这个字符串做 utf-8 转 GBK 的处理才能显示出来了。
这是两个关于汉字编码的地址可做参考
http://www.cnblogs.com/ttltry-air/p/3325543.html
https://www.zhihu.com/question/26921730