AjaxPython 3 与 Javascript escape 传输确保数据对方法与汉语乱码解决方案

style=”font-family: "Microsoft YaHei"”>注意:而今既无引进
escape 函数,推荐以  encodeURIComponent
函数,其中措施更简约,只待进行URL解码即可。

style=”font-family: "Microsoft YaHei"”>当然矣,如下文章解决方案一样中。

面前几乎上用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();

 

 

立只是少数经验之谈,如果来其它不当或又好的远在,欢迎指正,向其修,定当谢过。

 

相关文章