開發環境
- 系統: ubuntu18.04
- 系統編碼: $LANG = en_US.UTF-8
- python解釋器版本: Python 3.6.7
亂碼現場
使用 json.dumps() 將 dict 轉化為 json 數據的時候, 中文會顯示為對應的 unicode 編碼形式, 如果是將數據發送到第三方, 那么也會顯示 unicode 編碼形式, 很僵硬. ( 雖然說盡量使用英文進行交互, 但是相關部門的車牌號, 違法地址等信息都是中文的阿... )
demo:
param = {
"code": "0",
"message": "中文內容"
}
param1 = json.dumps(param, ensure_ascii=False)
param2 = json.dumps(param)
print(param1)
print(param2)
輸出內容:
param1: {"code": "0", "message": "中文內容"}
param2: {"code": "0", "message": "\u4e2d\u6587\u5185\u5bb9"}
並非亂碼, 其實是 unicode 的16進制表示形式.
分析
區別在於 ensure_ascii=False 這個參數, 看下 json.dumps() 的方法的源碼:
def dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
default=None, sort_keys=False, **kw):
...
# 如果 ensure_ascii 為false,則返回值可以包含非ascii值
If ``ensure_ascii`` is false, then the return value can contain non-ASCII
characters if they appear in strings contained in ``obj``. Otherwise, all
such characters are escaped in JSON strings.
...
使用 requests 發送中文數據的demo
# encoding: utf-8
import time
import json
import requests
def http_post(url, param=None):
param_json = param and json.dumps(param, ensure_ascii=False)
headers = {
"content-type": "application/json",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/71.0.3578.98 Safari/537.36"
}
with requests.Session() as session:
for i in range(3):
try:
resp = session.post(url, headers=headers, data=param_json.encode("utf-8"), verify=False, timeout=10)
if resp.status_code < 300:
print(resp)
return
else:
print('status code %s' % resp.status_code)
break
except Exception as e:
print(e)
time.sleep(1)
break
if __name__ == '__main__':
param = {
"code": "0",
"message": "中文內容"
}
param1 = json.dumps(param, ensure_ascii=False)
param2 = json.dumps(param)
print("param1: ", param1)
print("param2: ", param2)
http_post("http://10.10.19.199:8000/client/instesv/illegallogic", param=param)
接收方:
body content:[{"code": "0", "message": "中文內容"}]