Python 3 與 Javascript escape 傳輸確保數據正確方法和中文亂碼解決方案

来源:http://www.cnblogs.com/suwings/archive/2017/02/01/6360395.html
-Advertisement-
Play Games

前幾天用Python的Bottle框架寫個小web程式,在進行Ajax交互之時,前端則先用 JSON.stringify 來將類序列化,然後用escape() 函數將其編碼,確保傳輸正確。 再基本上配合上Jquery的$.ajax應該就可以了,可能是經驗不足,即使編碼之後的數據依然在 Python ...


前幾天用Python的Bottle框架寫個小web程式,在進行Ajax交互之時,前端則先用 JSON.stringify 來將類序列化,然後用escape() 函數將其編碼,確保傳輸正確。

再基本上配合上Jquery的$.ajax應該就可以了,可能是經驗不足,即使編碼之後的數據依然在 Python 中難以處理。

後來慢慢思考出一種方式,在網上也發現了類似的方式,於是將其實現。

 

基本思路如下:

escape('你好世界ABC');
//返回 "%u4F60%u597D%u4E16%u754CABC"

這串字元串提交到Bottle後,我利用Python 的 urllib 進行解碼,結果發現一個問題。。

>>> urllib.parse.unquote('%u4F60%u597D%u4E16%u754CABC')
'%u4F60%u597D%u4E16%u754CABC'
>>> 

這個字元串該是什麼樣子還是什麼樣子,於是研究了片刻,然後傻逼的發現,這個壓根就已經不是URL編碼的字元了,不能用 unquote解了。。

我們應該用 decode('UTF-8')!

 

%uXXXX 是Javascript轉成 Unicode 的樣子。所以我們必須要使它變成 \uXXXX 的Unicode的標準形式

而且Python中 unquote 只能對str進行URL解碼,所以這個是對Unicode編碼的中文字元是無法解開的,那麼我就必須使用 decode('UTF-8');

但是收到的字元又是str,不存在什麼decode,只有encode。後來查了下手冊找到了個 urllib.parse.unquote_to_bytes 函數,可對Str進行URL解碼,並且返回 byte。

對的,要的就是這個,然後依據返回的byte,就可以對其使用 decode 。

於是我就寫了一個:

def load_json(value):
    value = value.replace('%u','\\u') #將%uxxxx 替換換 \uxxxx 這才可以進行utf-8解碼
        byts = urllib.parse.unquote_to_bytes(value) #返回的 byte
    byts = byts.decode('UTF-8') # decode UTF-8 解碼只能解開 \uXXXX 的Unicode 標準形式
    return json.loads(byts)

 並且做以下測試:

escape('{"value":[123,"你好世界ABC"]}')
//"%7B%22value%22%3A%5B123%2C%22%u4F60%u597D%u4E16%u754CABC%22%5D%7D"

 Python Shell:

>>> load_json('%7B%22value%22%3A%5B123%2C%22%u4F60%u597D%u4E16%u754CABC%22%5D%7D')
{'value': [123, '你好世界ABC']}

 恭喜測試成功,看起來已經成功了。

總結:

這樣的話,縱使再如何的字元,都會被Unicode編碼。Javascript採用 escape(其他也行)來對字元進行UTF-8編碼,雖然得到的是%uXXXX,但是你可以傳化為 \uXXXX 的標準形式。

而且就算某些特別任性瀏覽器不會變成 %uXXXX,我們也只是 替換的%u,並不會影響實際的字元。

過程:

Javascript Object -> JSON.stringify(obj) -> escape(json_str) -> 瀏覽器的自動URL編碼(任性除外) -> Python urllib URL decode -> %uXXXX 替換 \uXXXX -> decode('UTF-8') -> json.load();

 

 

這隻是一點經驗之談,如果有任何錯誤或更好之處,歡迎指正,向其學習,定當謝過。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文彙總了C#啟動外部程式的幾種常用方法,非常具有實用價值,主要包括如下幾種方法: 1. 啟動外部程式,不等待其退出。 2. 啟動外部程式,等待其退出。 3. 啟動外部程式,無限等待其退出。 4. 啟動外部程式,通過事件監視其退出。 c#使用process.start啟動程式報錯解決方法 ...
  • 1 不跟你多廢話 上代碼! /// <summary> /// SQL關鍵字轉換器 /// </summary> public class SqlConverter : IKeywordsConvertible { public SqlConverter(string[] keywords) { K ...
  • G.系列導航 【G】開源的分散式部署解決方案 - 預告篇 【G】開源的分散式部署解決方案(一) - 開篇 【G】開源的分散式部署解決方案(二) - 好項目是從爛項目基礎上重構出來的 分析目前項目結構 眼前出現這麼一坨坨的文件夾,相信很多人已經看不下去了。是的,首先就是要把它給做掉。 按照這個項目文件 ...
  • 在上一節我們介紹了Iteratee。它的功能是消耗從一些數據源推送過來的數據元素,不同的數據消耗方式代表了不同功能的Iteratee。所謂的數據源就是我們這節要討論的Enumerator。Enumerator是一種數據源:它會根據下游數據消耗方(Iteratee)的具體狀態主動向下推送數據元素。我們 ...
  • 3196: Tyvj 1730 二逼平衡樹 Description 您需要寫一種數據結構(可參考題目標題),來維護一個有序數列,其中需要提供以下操作:1.查詢k在區間內的排名2.查詢區間內排名為k的值3.修改某一位值上的數值4.查詢k在區間內的前驅(前驅定義為小於x,且最大的數)5.查詢k在區間內的 ...
  • 安裝篇 第一步:配置防火牆(預設情況下,埠80和3306是拒絕訪問的,在防火牆上進行配置): vi /etc/sysconfig/iptables(在"COMMIT"的上一行加上如下兩句) -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 ...
  • ​byte: java中最小的數據類型。1位元組/8位。-128(2^7)~127(2^7-1),預設值0。 short: 短整型,2位元組/16位,取值範圍-32768(--2^15)~32767(2^15-1),預設值0 int: 整型,4位元組/32位,取值範圍-2147483648(-2^31)~ ...
  • C++14 SFINAE 解引用迭代器 原問題:編寫函數f(r),若r為迭代器,則返回f(*r),否則返回r。 摘要: 問題: 什麼是迭代器? 迭代器是c++中的一個概念,若類型It滿足以下條件,則It為迭代器類型 可拷貝構造(CopyConstructible) 可拷貝賦值(CopyAssigna ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...