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:这是一 ...
随机推荐
- Kubernetes1.4新特性前瞻:设置JOB执行计划
(一) 核心概念 Kubernetes在新版中会新增了一个设置JOB执行计划的功能,在1.3中已经可以初见端倪了,从进度上来看会在1.4版本中进行发布,下面我们先睹为快. Kubernetes通过这 ...
- cume_dist(),名次分析——-最大排名/总个数
函数:cume_dist() over(order by id) select id,area,score, cume_dist() over(order by id) a, --按ID最大排名/总个 ...
- TCP/IP 、HTTP和SOCKET
TCP/IP协议概念 TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议,这 ...
- @noi.ac - 171@ 立方体
目录 @description@ @solution@ @accepted code@ @details@ @description@ TonyFang 打算送你一些立方体. 你需要在 [1, n] ...
- iphone开发中调用系统打电话功能
iphone开发中调用打电话功能,一般有2种: 1.系统的打电话代码,不返回当前程序: Java代码 [[UIApplication sharedApplication] openURL:[NSURL ...
- autocomplete="off" inpu属性
input 的属性autocomplete 默认为on 其含义代表是否让浏览器自动记录之前输入的值 很多时候,需要对客户的资料进行保密,防止浏览器软件或者恶意插件获取到 可以在input中加入auto ...
- Postman使用入门
https://jingyan.baidu.com/article/0f5fb09907e3046d8334ea2f.html Postman测试管理的单位是测试集(Collections),测试集内 ...
- H3C 专线连接模型
- .net core 控制台下使用HttpClientFactory封装
HttpClientFactory封装,如有错误请指出,谢谢! using System; using System.Collections.Generic; using System.Net.Htt ...
- SuperSocket根据条件获取 Session
如果你有一个自定义的属性 "CompanyId" 在你的 AppSession 类之中,如果你想要获取这个属性等于某值的 的所有 Session, 你可以使用 AppServer ...