urldecode函数(urlretrieve函数)
大家好,关于urldecode函数很多朋友都还不太明白,今天小编就来为大家分享关于urlretrieve函数的知识,希望对各位有所帮助!
最近遇到的问题记录:UrlEncode、UrlDecode
在进行API调用时,遇到了需要使用UrlEncode与UrlDecode函数的问题。使用谷歌浏览器F12工具对第三方网站的接口进行抓包分析后,运维小哥哥发现,当参数使用了UrlEncode时,接口调用成功。然而,当接口参数为较为复杂的格式,且内容类型为application/x-www-form-urlencoded时,若未进行UrlEncode操作,服务端会返回错误信息“xxx解析失败”。
在开发过程中,开发小哥遇到了一个接口问题,接口参数使用了UrlEncode。在测试阶段,未对参数进行UrlEncode操作,接口测试成功。但当遇到更复杂的接口参数时,即使参数未使用UrlEncode,接口调用依然失败。开发小哥怀疑是否需要手动进行UrlEncode操作,但不确定为何非URL参数也需要编码。
为了解决问题,开发小哥尝试了参数编码,并最终成功调用了接口。猜测可能是服务端在接收参数时执行了UrlDecode操作。在解决过程中,开发小哥还对参数进行了两次UrlEncode操作:首先对具体的参数值(如Module)进行UrlEncode,然后对整个Content值进行UrlEncode。
总结经验,抓包分析时不能仅凭印象和已有知识进行操作。当接口测试成功而遇到后续问题时,应尝试各种方法解决问题,即使不确定原因,也应先尝试编码操作。最终,虽然使用了UrlEncode C#代码成功解决了问题,但更关键的是,运维小哥哥意识到在处理API调用时,应更多地依据实际数据和反馈进行调整和尝试。
如何正确运用PHP json_encode函数进行中文转换
在 php中使用 json_encode()内置函数(php>5.2)可以使用得 php中数据可以与其它语言很好的传递并且使用它。这个函数的功能是将数值转换成json数据存储格式,但是转换后的中文会变成Unicode编码。\x0d\x0a[php] view plaincopyprint?\x0d\x0a'希亚', \x0d\x0a'Age'=>20 \x0d\x0a); \x0d\x0a \x0d\x0a$jsonencode= json_encode($arr); \x0d\x0aecho$jsonencode; \x0d\x0a?> \x0d\x0a程序运行结果如下:\x0d\x0a[php] view plaincopyprint?\x0d\x0a{"Name":null,"Age":20} \x0d\x0ajson_encode函数中中文被编码成 null了,Google了一下,很简单,为了与前端紧密结合,Json只支持 utf-8编码,我认为是前端的 Javascript也是 utf-8的原因。\x0d\x0a[php] view plaincopyprint?\x0d\x0aiconv('gb2312','utf-8','这里是中文标题'), \x0d\x0a'body'=>'abcd...' \x0d\x0a); \x0d\x0a \x0d\x0aecho json_encode($array); \x0d\x0a?> \x0d\x0a这个程序的运行结果为:\x0d\x0a[php] view plaincopyprint?\x0d\x0a{"title":"\u8fd9\u91cc\u662f\u4e2d\u6587\u6807\u9898","body":"abcd..."} \x0d\x0a数组中所有中文在json_encode之后都不见了或者出现\u2353等。解决方法是用urlencode()函数处理以下,在json_encode之前,把所有数组内所有内容都用urlencode()处理一下,然用json_encode()转换成json字符串,最后再用urldecode()将编码过的中文转回来。\x0d\x0a[php] view plaincopyprint?\x0d\x0a 1000){ \x0d\x0a die('possible deep recursion attack'); \x0d\x0a} \x0d\x0a foreach($array as$key=>$value){ \x0d\x0a if(is_array($value)){ \x0d\x0a arrayRecursive($array[$key],$function,$apply_to_keys_also); \x0d\x0a} else{ \x0d\x0a$array[$key]=$function($value); \x0d\x0a} \x0d\x0a \x0d\x0a if($apply_to_keys_also&& is_string($key)){ \x0d\x0a$new_key=$function($key); \x0d\x0a if($new_key!=$key){ \x0d\x0a$array[$new_key]=$array[$key]; \x0d\x0a unset($array[$key]); \x0d\x0a} \x0d\x0a} \x0d\x0a} \x0d\x0a$recursive_counter--; \x0d\x0a} \x0d\x0a \x0d\x0a/************************************************************** \x0d\x0a* \x0d\x0a*将数组转换为JSON字符串(兼容中文) \x0d\x0a*@param array$array要转换的数组 \x0d\x0a*@return string转换得到的json字符串 \x0d\x0a*@access public \x0d\x0a* \x0d\x0a*************************************************************/ \x0d\x0afunction JSON($array){ \x0d\x0a arrayRecursive($array,'urlencode', true); \x0d\x0a$json= json_encode($array); \x0d\x0a return urldecode($json); \x0d\x0a} \x0d\x0a \x0d\x0a$array= array \x0d\x0a( \x0d\x0a'Name'=>'希亚', \x0d\x0a'Age'=>20 \x0d\x0a); \x0d\x0a\x0d\x0aecho JSON($array); \x0d\x0a?> \x0d\x0a这次成功了,运行结果如下:\x0d\x0a[php] view plaincopyprint?\x0d\x0a{"Name":"希亚","Age":"20"}
为什么要两次调用encodeURI来解决乱码问题
.encodeURL函数主要是来对URI来做转码,它默认是采用的UTF-8的编码.
. UTF-8编码的格式:一个汉字来三个字节构成,每一个字节会转换成16进制的编码,同时添加上%号.
假设页面端输入的中文是一个“中”,按照下面步骤进行解码
1.第一次encodeURI,按照utf-8方式获取字节数组变成[-28,-72-83],对字节码数组进行遍历,把每个字节转化成对应的16进制数,这样就变成了[E4,B8,AD],最后变成[%E4,%B8,%AD]此时已经没有了多字节字符,全部是单字节字符。
2、第二次encodeURI,进行编码,会把%看成一个转义字符,并不编码%以后字符,会把%编码成%25.把数组最后变成[%25E4,%25B8,%25AD]然后就把处理后的数据[%25E4,%25B8,%25AD]发往服务器端,
当应用服务器调用getParameter方法,getParameter方法会去向应用服务器请求参数
应用服务器最初获得的就是发送来的[%25E4,%25B8,%25AD],应用服务器会对这个数据进行URLdecode操作,应用服务器进行解码的这一次,不管是按照UTF-8,还是GBK,还是ISO-8859,,都能得到[%E4,%B8,%AD],因为都会把%25解析成%.并把这个值返回给getParameter方法
3\、再用UTF-8解码一次,就得到"中"了。
想想看,如果不编码两次,当服务器自动解码的时候,假如是按照ISO-8859去解码UTF-8编码的东西,就是会出现乱码。
JS:
[sql] view plain copy
document.authorityForm.action= basePath3+"User_viewUser.do?id="+id+"&roleName="+encodeURI(encodeURI(roleName))+"&roleType="+roleType;
Java后台:
[sql] view plain copy
roleName= java.net.URLDecoder.decode(getRequest().getParameter("roleName"),"UTF-8");
urldecode函数和urlretrieve函数的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!