用JavaScript实现PHP的urlencode与urldecode函数

很多朋友说JavaScript的decodeURI函数也可以实现,但有bug所有呢,下面看下下面的函数,经过测试使用暂时没什么问题,我在之前的文章说过,这个和php的urldecode函数根本不是一回事。下面是我根据高人的代码改写的JavaScript版的urldecode函数,参考的链接在开头提到的文章中有,就不一一列举了。和之前的urlencode函数一样,只实现了utf-8版的。

1、urlencode

使用方法: urlencode(str);

function urlencode(clearString)
{
	var output = '';
	var x = 0;

	clearString = utf16to8(clearString.toString());
	var regex = /(^[a-zA-Z0-9-_.]*)/;

	while (x < clearString.length)
	{
		var match = regex.exec(clearString.substr(x));
		if (match != null && match.length > 1 && match[1] != '')
		{
			output += match[1];
			x += match[1].length;
		}
		else
		{
			if (clearString[x] == ' ')
				output += '+';
			else
			{
				var charCode = clearString.charCodeAt(x);
				var hexVal = charCode.toString(16);
				output += '%' + ( hexVal.length < 2 ? '0' : '' ) + hexVal.toUpperCase();
			}
			x++;
		}
	}

	function utf16to8(str)
	{
		var out, i, len, c;

		out = "";
		len = str.length;
		for(i = 0; i < len; i++)
		{
			c = str.charCodeAt(i);
			if ((c >= 0x0001) && (c <= 0x007F))
			{
				out += str.charAt(i);
			}
			else if (c > 0x07FF)
			{
				out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
				out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
				out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
			}
			else
			{
				out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
				out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
			}
		}
		return out;
	}

	return output;
}

2、urldecode

使用方法:urldecode(url);

function urldecode(encodedString)
{
	var output = encodedString;
	var binVal, thisString;
	var myregexp = /(%[^%]{2})/;
	function utf8to16(str)
	{
		var out, i, len, c;
		var char2, char3;

		out = "";
		len = str.length;
		i = 0;
		while(i < len)
		{
			c = str.charCodeAt(i++);
			switch(c >> 4)
			{
				case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
				out += str.charAt(i-1);
				break;
				case 12: case 13:
				char2 = str.charCodeAt(i++);
				out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
				break;
				case 14:
				char2 = str.charCodeAt(i++);
				char3 = str.charCodeAt(i++);
				out += String.fromCharCode(((c & 0x0F) << 12) |
						((char2 & 0x3F) << 6) |
						((char3 & 0x3F) << 0));
				break;
			}
		}
		return out;
	}
	while((match = myregexp.exec(output)) != null
				&& match.length > 1
				&& match[1] != '')
	{
		binVal = parseInt(match[1].substr(1),16);
		thisString = String.fromCharCode(binVal);
		output = output.replace(match[1], thisString);
	}

	//output = utf8to16(output);
	output = output.replace(/\\+/g, " ");
	output = utf8to16(output);
	return output;
}

当服务器端通过php的urlencode转码的就可以使用js的urldecode进行解析即可。

(0)

相关推荐

  • php中base64_decode与base64_encode加密解密函数实例

    本文实例讲述了php中base64_decode与base64_encode加密解密函数.分享给大家供大家参考.具体分析如下: 这两个函数在php中是用得对php代码进行加密与解密码的base64_encode是加密,而base64_decode是解密了,下面我们看两个简单实例. base64_encode语法:string base64_decode(string data); 复制代码 代码如下: $str='d3d3LmpiNTEubmV0IOiEmuacrOS5i+Wutg==';   

  • php urlencode()与urldecode()函数字符编码原理详解

    其原理就是把中文字符转换为十六进制并按某种规则进行字符串组合,实现字符的编码与解编码,保证URL数据传递过程中字符的完整性和兼容性,主要讨论中文字符的编码情况. 一,FireFox浏览器编码中文字符 在Firefox浏览器下如果输入中文字符,将会自动实现URL编码,如下 按下Enter键前 按下Enter键后 二,urlencode()函数原理 urlencode()函数用于编码URL字符串,这里主要讨论中文字符的编码情况, 实例如下 复制代码 代码如下: echo urlencode('不要迷

  • php中json_decode()和json_encode()的使用方法

    1.json_decode() json_decode (PHP 5 >= 5.2.0, PECL json >= 1.2.0) json_decode - 对 JSON 格式的字符串进行编码 说明 mixed json_decode ( string $json [, bool $assoc ] ) 接受一个 JSON 格式的字符串并且把它转换为 PHP 变量 参数 json 待解码的 json string 格式的字符串. assoc 当该参数为 TRUE 时,将返回 array 而非 o

  • PHP中json_encode、json_decode与serialize、unserialize的性能测试分析

    于是便联想到PHP中的对象怎么样序列化存储性价比最高呢?接着想到了之前同事推荐的JSON编码和解码函数. 据他所说,json_encode和json_decode比内置的serialize和unserialize函数要高效. 于是我决定动手实验,证实一下同事所说的情况是否属实. 实验分别在PHP 5.2.13和PHP 5.3.2环境下进行. 用同一个变量,分别用以上方式进行编码或解码10000次,并得出每个函数执行10000次所需的时间. 以下是PHP 5.2.13环境其中一次测试结果: 复制代

  • 浅析php中json_encode()和json_decode()

    json_encode() 该函数主要用来将数组和对象,转换为json格式. 复制代码 代码如下: $arr = array ('a'=>'a','b'=>'b','c'='c','d'=>'d','e'='e');echo json_encode($arr); 输出结果: json只接受utf-8编码的字符,json_encode()的参数必须是utf-8编码. 复制代码 代码如下: class person{    public $name;    public $age;    p

  • 关于php中的json_encode()和json_decode()函数的一些说明

    一,json语法( php中的json_decode($json)中的$json要符合json语法格式 ) ① JSON可以表示三种类型的值 1,简单值.包括整型,字符串型,布尔值和null.例如:5,"hello world",true,null都是有效的JSON数据.其中JSON字符串必须使用双引号(单引号会导致语法错误). 2,对象.如,{"name":"tony","age":15}.说明①要求属性必须用双引号(不加或

  • php自定义urlencode,urldecode函数实例

    本文实例讲述了php自定义urlencode,urldecode函数.分享给大家供大家参考.具体如下: //配合JavaScript的ajaxObject函数, 对字串进行转码. function ajax_encode($str){ $patern = array("/%/","/=/","/&/"); // % 必须是第一个项, 替换是按项的顺序进行的. $rp = array("%25","%26&qu

  • 用JavaScript实现PHP的urlencode与urldecode函数

    很多朋友说JavaScript的decodeURI函数也可以实现,但有bug所有呢,下面看下下面的函数,经过测试使用暂时没什么问题,我在之前的文章说过,这个和php的urldecode函数根本不是一回事.下面是我根据高人的代码改写的JavaScript版的urldecode函数,参考的链接在开头提到的文章中有,就不一一列举了.和之前的urlencode函数一样,只实现了utf-8版的. 1.urlencode 使用方法: urlencode(str); function urlencode(cl

  • 用JavaScript实现UrlEncode和UrlDecode的脚本代码

    复制代码 代码如下: <script type="text/vbscript">     Function str2asc(strstr)       str2asc = hex(asc(strstr))      End Function      Function asc2str(ascasc)       asc2str = chr(ascasc)      End Function     </script> 将vbscript函数转成javascrip

  • Python3中urlencode和urldecode的用法详解

    在Python3中,将中文进行urlencode编码使用函数 urllib.parse.quote(string, safe='/', encoding=None, errors=None) 而将编码后的字符串转为中文,则使用 urllib.parse.unquote(string, encoding='utf-8', errors='replace') 示例代码如下: test = "微信公众账号比特量化" print(test) new = urllib.parse.quote(t

  • C++ 写的UrlEncode和UrlDecode实例

    关于UrlEncode的实现(C++).网上有非常多不同的版本号.对须要编码的字符集的选取并不统一.那么究竟有没有标准呢?答案是有的. 绝对不编码的,仅仅有字母.数字.短横线(-).下划线(_).点(.)和波浪号(~),其它字符要视情况而定.所以一般性的urlencode仅仅需保留上述字符不进行编码. 以下给出实现: unsigned char ToHex(unsigned char x) { return x > 9 ? x + 55 : x + 48; } unsigned char Fro

  • Python之urlencode和urldecode案例讲解

    python中的urlencode和urldecode python将字符串转化成urlencode ,或者将url编码字符串decode的方法: 方法1: urlencode:urllib中的quote方法 >>> from urllib import quote >>> quote(':') '%3A' >>> quote('http://www.baidu.com') 'http%3A//www.baidu.com' urldecode:urll

  • javascript另类方法实现htmlencode()与htmldecode()函数实例分析

    本文实例讲述了javascript另类方法实现htmlencode()与htmldecode()函数.分享给大家供大家参考,具体如下: 最常见的做法是采用正则表达式替换的方法,将特殊字符如 < > & 等进行替换,htmlencode的时候这样替换还比较容易,但发过来htmldecode的时候就不一定好用了,因为需要反转的情况很多,出了常见的<>&以外,还有 ©"®等数十个字符实体,还有AB中文或者中文之类以字符的Unicode编码的十进制或16进制表示的

  • JavaScript基础篇(6)之函数表达式闭包

    其实js支持函数闭包的主要原因是因为js需要函数能够保存数据.这里的保存数据是只函数在运行结束以后函数内变量的值也会进行保存.至于为什么js需要在函数内可以保存数据,那就是js是一种函数式语言.在函数内保存数据是函数式语言的一大特征. 回顾前面介绍过的三种定义函数方式 functiosu(numnumreturnunum//函数声明语法定义 vasufunction(numnum)returnunum}//函数表达式定义 vasuneFunction("num""num&qu

  • JavaScript为事件句柄绑定监听函数实例详解

    本文实例讲述了JavaScript为事件句柄绑定监听函数的方法.分享给大家供大家参考,具体如下: 在JavaScript中为Dom元素绑定事件监听函数是一件非常常见的事情,但这里也有许多的Bug.各种浏览器对于事件绑定都提供了很多方法,但可靠的只有3中: 1.传统的绑定方法: elem.onclick = function( event ){ alert(event.type + 'this.innerHTML'); }; a.传统的绑定方法,非常简单稳定,函数体内的this指向的也是指向正在处

随机推荐