用JavaScript实现PHP的urlencode与urldecode函数


Posted in Javascript onAugust 13, 2015

很多朋友说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进行解析即可。

Javascript 相关文章推荐
关于COOKIE个数与大小的问题
Jan 17 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
Dec 10 Javascript
js判断undefined类型示例代码
Feb 10 Javascript
js统计录入文本框中字符的个数并加以限制不超过多少
May 23 Javascript
jquery实现显示已选用户
Jul 21 Javascript
基于JS2Image实现圣诞树代码
Dec 24 Javascript
AngularJS 中的Promise --- $q服务详解
Sep 14 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
Feb 23 Javascript
jQuery is not defined 错误原因与解决方法小结
Mar 19 Javascript
jQuery pjax 应用简单示例
Sep 20 jQuery
vue拖拽排序插件vuedraggable使用方法详解
Aug 21 Javascript
vue中组件的3种使用方式详解
Mar 23 Javascript
asp.net中oracle 存储过程(图文)
Aug 12 #Javascript
JavaScript的jQuery库插件的简要开发指南
Aug 12 #Javascript
JavaScript中的call方法和apply方法使用对比
Aug 12 #Javascript
详细解读JavaScript的跨浏览器事件处理
Aug 12 #Javascript
基于jQuery实现动态数字展示效果
Aug 12 #Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
Aug 12 #Javascript
深入解读JavaScript中的Hoisting机制
Aug 12 #Javascript
You might like
sql注入与转义的php函数代码
2013/06/17 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
js类型检查实现代码
2010/10/29 Javascript
Chosen 基于jquery的选择框插件使用方法
2012/05/30 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
Vue.js每天必学之方法与事件处理器
2016/09/06 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
2016/09/27 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
jQuery的Ajax接收java返回数据方法
2018/08/11 jQuery
Vue.js组件间通信方式总结【推荐】
2018/11/23 Javascript
微信小程序云开发详细教程
2019/05/16 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
layui操作列按钮个数和文字颜色的判断实例
2019/09/11 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
[10:42]Team Liquid Vs Newbee
2018/06/07 DOTA
开始着手第一个Django项目
2015/07/15 Python
python计算auc指标实例
2017/07/13 Python
python数据类型判断type与isinstance的区别实例解析
2017/10/31 Python
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
python实现列表中由数值查到索引的方法
2018/06/27 Python
python 拼接文件路径的方法
2018/10/23 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
django序列化时使用外键的真实值操作
2020/07/15 Python
canvas线条的属性详解
2018/03/27 HTML / CSS
weblogic面试题
2016/03/07 面试题
科学发展观活动总结
2014/08/28 职场文书
2014优秀大学生简历自我评价
2014/09/15 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
2014年民政工作总结
2014/11/26 职场文书
公司借条范本
2015/05/25 职场文书
现货白银电话营销话术
2015/05/29 职场文书
演讲稿:态度决定一切
2019/04/02 职场文书
2019年描写人生经典诗句大全
2019/07/08 职场文书
Win11 PC上的Outlook搜索错误怎么办?
2022/07/15 数码科技