还未发布过话题
  • 假如服务端是接受 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