用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 相关文章推荐
读jQuery之十三 添加事件和删除事件的核心方法
Aug 23 Javascript
面向对象Javascript核心支持代码分享
May 23 Javascript
jquery中animate动画积累的解决方法
Oct 05 Javascript
jquery对ajax的支持介绍
Dec 10 Javascript
js replace替换所有匹配的字符串
Feb 13 Javascript
JavaScript将取代AppleScript?
Sep 18 Javascript
用C/C++来实现 Node.js 的模块(一)
Sep 24 Javascript
JavaScript中实现依赖注入的思路分享
Jan 15 Javascript
node.js cookie-parser之parser.js
Jun 06 Javascript
详解node child_process模块学习笔记
Jan 24 Javascript
js实现车辆管理系统
Aug 26 Javascript
浅谈vant组件Picker 选择器选单选问题
Nov 04 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
PHP通用检测函数集合
2006/11/25 PHP
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
2014/05/08 PHP
javascript背投广告代码的完善
2008/04/08 Javascript
JS写的数字拼图小游戏代码[学习参考]
2008/10/29 Javascript
javascript 获取图片颜色
2009/04/05 Javascript
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
json的前台操作和后台操作实现代码
2012/01/20 Javascript
Chrome扩展页面动态绑定JS事件提示错误
2014/02/11 Javascript
基于JQuery制作可编辑的表格特效
2014/12/23 Javascript
React中的refs的使用教程
2018/02/13 Javascript
jQuery实现高度灵活的表单验证功能示例【无UI】
2020/04/30 jQuery
react中hook介绍以及使用教程
2020/12/11 Javascript
Python 命令行非阻塞输入的小例子
2013/09/27 Python
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
Python Tkinter模块实现时钟功能应用示例
2018/07/23 Python
python查看模块安装位置的方法
2018/10/16 Python
Python3.5 处理文本txt,删除不需要的行方法
2018/12/10 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
2020/01/14 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
Python实现手势识别
2020/10/21 Python
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
极简鞋类,赤脚的感觉:Lems Shoes
2019/08/06 全球购物
文明和谐家庭事迹材料
2014/05/18 职场文书
团队精神口号
2014/06/06 职场文书
计划生育证明格式范本
2014/09/12 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
档案工作个人总结
2015/03/03 职场文书
在职人员跳槽求职信
2015/03/20 职场文书
2015年读书月活动总结
2015/03/26 职场文书
党支部考察意见范文
2015/06/02 职场文书
好人好事新闻稿
2015/07/17 职场文书
爱护环境建议书
2015/09/14 职场文书
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers