python3的編碼問題一直比較簡單
內存中字符串采用unicode
存儲到文件中采用utf-8
以下為str,byte互相轉換的過程:
str = "abc學習"
strOut[6]: 'abc學習'mybyte = str.encode("utf-8")mybyteOut[8]: b'abc\xe5\xad\xa6\xe4\xb9\xa0'str2 = mybyte.decode("utf-8")str2Out[10]: 'abc學習'
最近在寫json相關的文件存取,遇到這樣的問題:
import json
json_str = """{"a": " 1", "f": "100\n", "b": "好好學習"}"""json_strOut[20]: '{"a": " 1", "f": "100\n", "b": "好好學習"}'json_str = json_str.encode('unicode_escape').decode('utf-8')json_strOut[22]: '{"a": " 1", "f": "100\\n", "b": "\\u597d\\u597d\\u5b66\\u4e60"}'json_data = json.loads(json_str, encoding="utf-8")json_dataOut[24]: {'a': ' 1', 'b': '好好學習', 'f': '100\n'}dumps_str = json.dumps(json_data, indent=4)
dumps_strOut[26]: '{\n "f": "100\\n",\n "a": " 1",\n "b": "\\u597d\\u597d\\u5b66\\u4e60"\n}'json_data = json.loads(dumps_str)
json_dataOut[28]: {'a': ' 1', 'b': '好好學習', 'f': '100\n'}
從上面的事例看出,通過string轉成json后,再通過json.dumps轉成字符串后,原先的好好學習變成了中文編碼,存儲到文件中也是中文編碼,很不直觀。
經過摸索,采用如下方法即可使得dumps轉成中文(ensure_ascii=False)
dumps_str = json.dumps(json_data, ensure_ascii=False, indent=4)
dumps_strOut[30]: '{\n "f": "100\\n",\n "a": " 1",\n "b": "好好學習"\n}'