js实现php函数urlencode
原文链接:https://www.cnblogs.com/xiaochaohuashengmi/archive/2010/05/28/1746168.html
本文介绍了php函数urlencode的js实现方法并比较js和php各编码函数的区别。
通常form表单的enctype类型为 application/x-www-form-urlencoded, 当表单提交后,提交的数据自动被编码, 规则为" 除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。", php的urlencode函数与其功能相同。
js编码方法:escape, encodeURI, encodeURIComponent。
escape可以对大多数符号进行编码,但是对unicode字符无效。
php编码方法:urlencode, rawurlencode, htmlentities。
urlencode和rawurlencode唯一的区别是对空格的编码方式不同,rawurlencode遵循RFC 1738编码将空格转换为 %20。
如何用js实现php的urlencode功能, 网上流传着一段js和vbscript混写的代码,通用性不好,另找到国外一高人写的, 经测试与urlencode相同。
function URLEncode (clearString) {
var output = '';
var x = 0;
clearString = 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.substr(x, 1) == ' ') {
//原文在此用 clearString[x] == ' ' 做判断, 但ie不支持把字符串当作数组来访问,
//修改后两种浏览器都可兼容
output += '+';
}
else {
var charCode = clearString.charCodeAt(x);
var hexVal = charCode.toString(16);
output += '%' + ( hexVal.length < 2 ? '0' : '' ) + hexVal.toUpperCase();
}
x++;
}
}
return output;
}
下面附上js和php几种编码方法对特殊符号的编码对照表:
| Input | JavaScript | PHP | ||||
| escape | encodeURI | encodeURIComponent | urlencode | rawurlencode | htmlentities | |
|---|---|---|---|---|---|---|
| <space> | %20 | %20 | %20 | + | %20 | |
| ! | %21 | ! | ! | %21 | %21 | ! |
| @ | @ | @ | %40 | %40 | %40 | @ |
| # | %23 | # | %23 | %23 | %23 | # |
| $ | %24 | $ | %24 | %24 | %24 | $ |
| % | %25 | %25 | %25 | %25 | %25 | % |
| ^ | %5E | %5E | %5E | %5E | %5E | ^ |
| & | %26 | & | %26 | %26 | %26 | & |
| * | * | * | * | %2A | %2A | * |
| ( | %28 | ( | ( | %28 | %28 | ( |
| ) | %29 | ) | ) | %29 | %29 | ) |
| - | - | - | - | - | - | - |
| _ | _ | _ | _ | _ | _ | _ |
| = | %3D | = | %3D | %3D | %3D | = |
| + | + | + | %2B | %2B | %2B | + |
| : | %3A | : | %3A | %3A | %3A | : |
| ; | %3B | ; | %3B | %3B | %3B; | ; |
| . | . | . | . | . | . | . |
| " | %22 | %22 | %22 | %22 | %22 | " |
| ' | %27 | ' | ' | %27 | %27 | ' |
| \ | %5C | %5C | %5C | %5C | %5C | \ |
| / | / | / | %2F | %2F | %2F | / |
| ? | %3F | ? | %3F | %3F | %3F | ? |
| < | %3C | %3C | %3C | %3C | %3C | < |
| > | %3E | %3E | %3E | %3E | %3E | > |
| ~ | %7E | ~ | ~ | %7E | %7E | ~ |
| [ | %5B | %5B | %5B | %5B | %5B | [ |
| ] | %5D | %5D | %5D | %5D | %5D | ] |
| { | %7B | %7B | %7B | %7B | %7B | { |
| } | %7D | %7D | %7D | %7D | %7D | } |
| ` | %60 | %60 | %60 | %60 | %60 | ` |
var Url = {
// public method for url encoding
encode : function (string) {
return escape(this._utf8_encode(string));
},
// public method for url decoding
decode : function (string) {
return this._utf8_decode(unescape(string));
},
// private method for UTF-8 encoding
_utf8_encode : function (string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
}
else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
},
// private method for UTF-8 decoding
_utf8_decode : function (utftext) {
var string = "";
var i = 0;
var c = c1 = c2 = 0;
while ( i < utftext.length ) {
c = utftext.charCodeAt(i);
if (c < 128) {
string += String.fromCharCode(c);
i++;
}
else if((c > 191) && (c < 224)) {
c2 = utftext.charCodeAt(i+1);
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i += 2;
}
else {
c2 = utftext.charCodeAt(i+1);
c3 = utftext.charCodeAt(i+2);
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}
}
return string;
}
}
这个urlencode有个bug, 对照一下,上面第一个函数把 "-"(中线)丢了,网上的东西不能太过于相信了。不能简单的拿来主义,仔细检查后才能使用。
js实现php函数urlencode的更多相关文章
- Node.js 教程 06 - 函数
前言: 本篇介绍的是Node.js中的函数,相对于上一篇会简单一点,其实和我们Javascript中的function无异. 好了,废话不多说了,我们进入正题吧. Node.js函数: [示例1:创建 ...
- 关于js的回调函数的一点看法
算了一下又有好几个月没写博客了,最近在忙公司android的项目,所以也就很少抽时间来写些东西了.刚闲下来,我就翻了翻之前看的东西.做了android之后更加感觉到手机端开发的重要性,现在做nativ ...
- js立即执行函数
一.JS立即执行函数的写法 方式1.最前最后加括号 (function(){alert(1);}()); 方式2.function外面加括号 (function(){alert(1);})(); ...
- js 数组处理函数
本文转载自有有<js 数组处理函数> concat 将参数列表连接到原数组后面形成一个新的数组并返回,原有数组不受影响. var arr = ["a","b& ...
- JS字符串替换函数:Replace(“字符串1″, “字符串2″),
JS字符串替换函数:Replace(“字符串1″, “字符串2″), 1.我们都知道JS中字符串替换函数是Replace(“字符串1″, “字符串2″),但是这个函数只能将第一次出现的字符串1替换掉, ...
- js使用split函数按照多个字符对字符串进行分割的方法
这篇文章主要介绍了js使用split函数按照多个字符对字符串进行分割的方法,实例分析了split函数的使用技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了js使用split函数按照多个 ...
- js的匿名函数和js的onload函数
所谓js匿名函数就是当用户一打开页面时不等到文档加载完就会执行里面的代码,语法如下: (function(){})(); js的onload函数代码如下: <!DOCTYPE html>& ...
- JavaScript基础11——js的全局函数
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 笔记:js的replace函数
replace函数 js的replace函数与c#的有一个不同,js的只替换第一个字符 例如,var a=',1,2' var b=a.replace(',','') 结果b='1,2'(ps:这是一 ...
随机推荐
- Oracle TRIM函数语法介绍
Oracle中trim的完整参数TRIM([ { { LEADING | TRAILING | BOTH } [ trim_character ] | trim_character } F ...
- 阿里云oss上传图片报错,The OSS Access Key Id you provided does not exist in our records.解决方法
vue项目 1.安装OSS的Node SDK npm install ali-oss --save 2.参考官方提示https://help.aliyun.com/document_detail/11 ...
- WPF Binding ElementName方式无效的解决方法--x:Reference绑定
原文:WPF Binding ElementName方式无效的解决方法--x:Reference绑定 需求: 背景:Grid的有一个TextBlock name:T1和一个ListBox,ListBo ...
- Pytorch使用tensorboardX网络结构可视化。超详细!!!
https://www.jianshu.com/p/46eb3004beca 1 引言 我们都知道tensorflow框架可以使用tensorboard这一高级的可视化的工具,为了使用tensorbo ...
- C语言中内存的管理
一.动态内存分配与释放 1.为什么要使用动态内存分配,以下看一个实例,关于超市中购买记录的一段程序 #include <stdio.h> #include <string.h> ...
- websocket实现数据库更新时前端页面实时刷新
websocket实现数据库更新时前端页面实时刷新 javaweb 目录(?)[+] userjsp ManagerServletjava 如题,实现以上功能,我知道主要有两大种思路: 轮询:轮询的原 ...
- Spring AOP 的@Aspect
Spring AOP 的@Aspect 转自:http://blog.csdn.net/tanghw/article/details/3862987 从Spring 2.0开始,可以使用基于sch ...
- 21Hash算法以及暴雪Hash
一:哈希表简介 哈希表是一种查找效率极高的数据结构,理想情况下哈希表插入和查找操作的时间复杂度均为O(1),任何一个数据项可以在一个与哈希表长度无关的时间内计算出一个哈希值(key),然后在常量时间内 ...
- 因为 Java 和 Php 在获取客户端 cookie 方式不同引发的 bug
遇到个 Java 和 Php 在获取客户端 cookie 方式不同导致跨系统的问题.所以写了这篇博客梳理下相关知识. 实验 下面通过两个简单的实验,来看Java和Php在获取web请求中的cookie ...
- js常见运算符
博客地址 :https://www.cnblogs.com/sandraryan/