『壹』 涓轟粈涔坖son搴忓垪鍖栧悗鏈灝懼嚭鐜伴棶鍙
json搴忓垪鍖栧悗鏈灝懼嚭鐜伴棶鍙風殑鍘熷洜鏈夛細
1銆侀潪娉曞瓧絎︽垨緙栫爜闂棰橈細JSON瑙勮寖瑕佹眰鎵鏈夌殑瀛楃︿覆鍊煎繀欏諱嬌鐢ㄥ弻寮曞彿鎷璧鋒潵錛岃屼笉鏄鍗曞紩鍙鳳紝鍦↗SON瀛楃︿覆涓浣跨敤浜嗗崟寮曞彿錛屽垯搴忓垪鍖栬繃紼嬩腑浼氬嚭鐜扮紪鐮侀棶棰橈紝瀵艱嚧瀛楃︿覆搴忓垪鍖栧悗鏈灝懼嚭鐜伴棶鍙楓
2銆佺紪鐮佹牸寮忎笉鍖歸厤錛欽SON搴忓垪鍖栬繃紼嬩腑錛屽皢Python瀵硅薄杞鍖栦負JSON瀛楃︿覆鏃訛紝闇瑕佺『淇濆硅薄鐨勭紪鐮佹牸寮忎笌JSON瑙勮寖鎵鏀鎸佺殑緙栫爜鏍煎紡鍖歸厤錛屽硅薄鐨勭紪鐮佹牸寮忎笉鏄疛SON瑙勮寖鎵鏀鎸佺殑錛岄偅涔堝湪搴忓垪鍖栬繃紼嬩腑浼氬嚭鐜扮紪鐮侀棶棰橈紝瀵艱嚧瀛楃︿覆搴忓垪鍖栧悗鏈灝懼嚭鐜伴棶鍙楓傚簭鍒楀寲鏄鎸囧皢瀵硅薄杞鎹涓哄瓧鑺傛祦鐨勮繃紼嬶紝浠ヤ究鍦ㄧ綉緇滀笂浼犺緭鎴栧瓨鍌ㄥ埌紓佺洏絳変粙璐ㄤ腑錛屽湪搴忓垪鍖栬繃紼嬩腑錛屽硅薄鐨勭姸鎬佽緙栫爜涓哄瓧鑺傛祦錛屽彲浠ュ湪闇瑕佹椂榪涜屽弽搴忓垪鍖栨搷浣滐紝灝嗗瓧鑺傛祦閲嶆柊杞鎹涓哄硅薄銆
『貳』 Python: 在使用 JSON 時需要注意的編碼問題!
在使用Python的requests庫進行介面請求時,若直接通過json欄位發送包含中文的請求數據,可能會遇到伺服器無法識別的問題。原因在於requests庫內部默認使用json.mps進行字元串轉JSON操作時,會對非ASCII字元進行轉義處理。這意味著在發送的數據中,中文字元被轉換為轉義字元,例如"中文"會被轉為"\u4e2d\u6587",導致伺服器無法正確解析。
理解Python中的字元編碼對於解決這一問題至關重要。在Python3中,字元默認使用Unicode編碼存儲,一個常規字元通常由兩個位元組表示,而某些特殊或罕見字元可能需要四個位元組。例如,在Python Shell中輸入字元串'\u4e2d\u6587',輸出結果為"中",這里\u4e2d和\u6587分別代表"中"和"文"的Unicode碼點的十六進製表示。
獲取字元的Unicode碼點可以利用Python的標准庫函數ord和chr。ord函數輸出字元的Unicode碼點,而chr函數則將碼點轉換回字元。
在使用json.mps函數時,`ensure_ascii`參數的設置至關重要。當`ensure_ascii`為`True`時,如果字元串中包含非ASCII字元,json.mps會將其轉義為Unicode碼表示,例如將"中文"轉為"\\u4e2d\\u6587"。而將`ensure_ascii`設為`False`,則不進行轉義,直接使用原始字元。這就是導致中文被轉義無法識別的原因。
若伺服器接收到的數據是被轉義過的,可以通過將接收到的字元串先使用utf-8編碼,再使用unicode_escape進行解碼,以識別轉義字元。具體實現方法是先將接收到的字元串編碼為utf-8,然後使用`unicode_escape`解碼,這樣可以復原轉義字元。
深入理解json.mps的轉義機制,可以發現其通過調用`JSONEncoder.encode`方法處理字元。在`encode`方法中,根據`ensure_ascii`的值選擇調用不同的函數進行轉義處理。`encode_basestring_ascii`函數是用於處理基本字元串的,其內部調用的`py_encode_basestring_ascii`函數實現轉義邏輯。此函數通過正則表達式對特定字元進行轉義處理,然後在前後添加雙引號。轉義規則定義在`ESCAPE_ASCII`中,其主要關注的是轉義字元和空格字元,對於中文字元也會進行轉義處理。
總結,使用requests庫發送包含中文的JSON數據時,應確保正確編碼,避免因非ASCII字元轉義導致的數據無法識別問題。在實際應用中,將`ensure_ascii`參數設置為`False`是一個有效解決方案,以確保中文字元在傳輸過程中保持原始形式。