zoukankan      html  css  js  c++  java
  • Javascript下的urlencode编码解码方法decodeURIComponent()

    关于在ASP(Server.UrlEncode)、PHP(urlencode())函数编码结果,或是经过asp、php等动态语言直接写入COOKIES的中文字符,用JS读取的时候,都会碰到一个编码的问题,那就是最终字符串被urlencode编码了,而又时有需要从JS在客户端去读取这些数据。而本文,就大概说说如何在js中通过系统自带的函数去解决这个问题。
    而相信碰到过此问题的朋友应该都有所了解,目前网络上流行一些js下的自定义函数去解决这个问题,如说vbscript(URLDecode())、javascript(UrlDecode())等。而这两个函数,都无法很好的与asp(Server.UrlEncode)、php(urlencode())这两个函数相互通讯。
    关于vbscript(function URLDecode())、javascript(function UrlDecode())在本文最后也会转载出来。
    而本文的主角就是javascript(UrlDecodedecodeURIComponent()),这个函数名称实在太常了,个人真的不太了解,毕竟js的系统函数很多,很容易遗漏。烦恼在偶然间发现了这个函数!
    编码函数:encodeURIComponent()
    解码函数:decodeURIComponent()
    decodeURIComponent()语法

    decodeURIComponent(URIstring)
    参 数:(URIstring)必需。一个字符串,含有编码 URI 组件或其他要解码的文本。
    返回值:URIstring 的副本,其中的十六进制转义序列将被它们表示的字符替换。

    实例:

    <script type="text/javascript"> 
    var test1="烦恼"; 
    var test2="%E7%83%A6%E6%81%BC"; 
    document.write("编码(原="+test1+"):"+encodeURIComponent(test1)+ "<br />"); 
    document.write("解码(原="+test2+"):"+decodeURIComponent(test2)); 
    </script>

    结果:

    编码(原=烦恼):%E7%83%A6%E6%81%BC
    解码(原=%E7%83%A6%E6%81%BC):烦恼

    注意:本文只在UTF-8编码环境下测试。因为在不同编码环境下,asp(Server.UrlEncode)所编译后的代码好像不同,有待测试!
    ================================
    附转载:
    vbscript(function URLDecode())

    <script type="text/VBscript">
    <!--
    Function URLDecode(enStr)
    	dim deStr,strSpecial
    	dim c,i,v
    	deStr=""
    	strSpecial="!""#$%&'()*+,.-_/:;<=>?@[\]^`{|}~%"
    	for i=1 to len(enStr)
    		c=Mid(enStr,i,1)
    		if c="%" then
    			v=eval("&h"+Mid(enStr,i+1,2))
    			if inStr(strSpecial,chr(v))>0 then
    			deStr=deStr&chr(v)
    			i=i+2
    			else
    			v=eval("&h"+ Mid(enStr,i+1,2) + Mid(enStr,i+4,2))
    			deStr=deStr & chr(v)
    			i=i+5
    			end if
    		else
    			if c="+" then
    			deStr=deStr&" "
    			else
    			deStr=deStr&c
    			end if
    		end if
    	next
    	URLDecode=deStr
    End function
    //-->
    </script>

    javascript(function UrlDecode())其实还是柔和使用了vbscript,好像在javascript环境中,对于asc、hex、chr相关的转换,如 str.charCodeAt(0).toString(16) 及 String.fromCharCode(str) 在不同编码下,对于中文的编码结果还不统一。
    比如: vbscript str2asc/asc2str

    <script type="text/vbscript"> 
        Function str2asc(strstr) 
        str2asc = hex(asc(strstr)) 
        End Function 
        Function asc2str(ascasc) 
        asc2str = chr(ascasc) 
        End Function 
        MsgBox str2asc("a")
        MsgBox asc2str("&H61")'16进制转的61 转到 10进制就是 97
    </script> 

    javascript str2asc/asc2str

    <script type="text/javascript"> 
    function str2asc(str){
        return str.charCodeAt(0).toString(16);
    }
    function asc2str(str){
        return String.fromCharCode(str);
    }
    alert(str2asc("a"));//
    alert(asc2str("0x61"));//
    </script> 

    演示:

    <script type="text/vbscript"> 
    			Function str2asc(strstr) 
    			str2asc = hex(asc(strstr)) 
    			End Function 
    			Function asc2str(ascasc) 
    			asc2str = chr(ascasc) 
    			End Function 
    </script> 
    <script type="text/javascript"> 
    	/*这里开始时UrlEncode和UrlDecode<a href="/?tag=%E5%87%BD%E6%95%B0" target="_blank">函数</a>*/ 
    	function UrlEncode(str){ 
    		var ret=""; 
    		var strSpecial="!\"#$%&'()*+,/:;<=>?[]^`{|}~%"; 
    		var tt= ""; 
    		for(var i=0;i<str.length;i++){ 
    		var chr = str.charAt(i); 
    		var c=str2asc(chr); 
    		tt += chr+":"+c+"n"; 
    		if(parseInt("0x"+c) > 0x7f){ 
    		ret+="%"+c.slice(0,2)+"%"+c.slice(-2); 
    		}else{ 
    		if(chr==" ") 
    		ret+="+"; 
    		else if(strSpecial.indexOf(chr)!=-1) 
    		ret+="%"+c.toString(16); 
    		else 
    		ret+=chr; 
    		} 
    		} 
    		return ret; 
    	} 
    	function UrlDecode(str){ 
    		var ret=""; 
    		for(var i=0;i<str.length;i++){ 
    		var chr = str.charAt(i); 
    		if(chr == "+"){ 
    		ret+=" "; 
    		}else if(chr=="%"){ 
    		var asc = str.substring(i+1,i+3); 
    		if(parseInt("0x"+asc)>0x7f){ 
    		ret+=asc2str(parseInt("0x"+asc+str.substring(i+4,i+6))); 
    		i+=5; 
    		}else{ 
    		ret+=asc2str(parseInt("0x"+asc)); 
    		i+=2; 
    		} 
    		}else{ 
    		ret+= chr; 
    		} 
    		} 
    		return ret; 
    	} 
    	alert(UrlDecode("%C2%D2%C2%EB")); 
    </script>
  • 相关阅读:
    VS2013 自动添加头部注释 -C#开发
    在调用Response.End()时,会执行Thread.CurrentThread.Abort()操作
    React
    WebApi基础
    wcf
    memcached系列
    Ioc容器Autofac系列
    使用TortoiseSVN创建版本库
    使用libcurl 发送post请求
    值得推荐的C/C++框架和库
  • 原文地址:https://www.cnblogs.com/lyz8/p/1691152.html
Copyright © 2011-2022 走看看