本文主要是介绍Server传过来使用Base64加密过的中文字符,在js端解密,解决乱码问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
背景:
接入企业微信web应用,需要使用微信的接口发送应用消息,消息中包含跳转到应用detail的a标签(url中会传参,包含中文字符),像这样
http://ip/PName/src/index.html#pages/pfunction/detail/functiondetail?eventType=default&fromuserName=张三&padtouserName=李四&paddate=2019-03-19
很奇怪的是,android系统的企业微信能够正常打开推送的url,ios系统的企业微信却不能打开,chrome浏览器也是一样,复制ios企业微信打开的详情地址,并报404错误
http://ip/PName/src/index.html%23pages/pfunction/detail/functiondetail?eventType=default&fromuserName=张三&padtouserName=李四&paddate=2019-03-19
初步觉得是#没有被转义过来导致的问题。
然而冤枉了#号,#在浏览器中代表的是资源定位,详细可查看这篇blog
最后想通过对url中的参数进行base64加密来解决这个乱码问题,过程并不是Base64.decode()那么简单,decode方法并不起作用。是因为服务器默认是使用UTF-8编码的,而JS默认是Unicode编码的(UTF-16),具体操作入下:
/** Javascript base64Decode() base64解密函数用于解密base64加密的字符串* 吴先成 www.51-n.com ohcc@163.com QQ:229256237* @param string input base64加密字符串* @return string 解密后的字符串*/function base64Decode(input){rv = window.atob(input);rv = escape(rv);rv = decodeURIComponent(rv);return rv;}
因为传过来的url点击后会被浏览器进行编码,例如:http%3A%2F%2Fwww.w3school.com.cn%2FMy%20first%2F,也就是浏览器默认会进行encodeURIComponent()。
所以我们要对数据进行decodeURIComponent()操作,变成http://www.w3school.com.cn/My first/
加密方法如下:
/** Javascript base64encode() base64加密函数用于生成字符串对应的base64加密字符串* 吴先成 www.51-n.com ohcc@163.com QQ:229256237* @param string input 原始字符串* @return string 加密后的base64字符串*/function base64Encode(input){var rv;rv = encodeURIComponent(input);rv = unescape(rv);rv = window.btoa(rv);return rv;}
window.btoa(字符串);//base64->ascii
window.atob(字符串);//ascii->base64
参考链接:https://www.51-n.com/t-4183-1-1.html
-------------------------------------------------------欢迎指正---------------------------------------------------
这篇关于Server传过来使用Base64加密过的中文字符,在js端解密,解决乱码问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!