• js实现php函数urlencode


    本文介绍了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相同。

    代码
     1 function URLEncode (clearString) {
     2   var output = '';
     3   var x = 0;
     4   clearString = clearString.toString();
     5   var regex = /(^[a-zA-Z0-9-_.]*)/;
     6   while (x < clearString.length) {
     7     var match = regex.exec(clearString.substr(x));
     8     if (match != null && match.length > 1 && match[1!= '') {
     9         output += match[1];
    10       x += match[1].length;
    11     } else {
    12       if (clearString.substr(x, 1== ' ') {
    13         //原文在此用 clearString[x] == ' ' 做判断, 但ie不支持把字符串当作数组来访问, 
    14         //修改后两种浏览器都可兼容 
    15         output += '+';
    16       }
    17       else {
    18         var charCode = clearString.charCodeAt(x);
    19         var hexVal = charCode.toString(16);
    20         output += '%' + ( hexVal.length < 2 ? '0' : '' ) + hexVal.toUpperCase();
    21       }
    22       x++;
    23     }
    24   }
    25   return output;
    26 }
     

    注:上面的代码引自 http://cass-hacks.com/articles/code/js_url_encode_decode/

    下面附上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 &amp;
    * * * * %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 &quot;
    ' %27 ' ' %27 %27 '
    \ %5C %5C %5C %5C %5C \
    / / / %2F %2F %2F /
    ? %3F ? %3F %3F %3F ?
    < %3C %3C %3C %3C %3C &lt;
    > %3E %3E %3E %3E %3E &gt;
    ~ %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 `

    上表引自 http://www.the-art-of-web.com/javascript/escape/

    另一个非常优秀的urlencode和urldecode函数

    代码
     1 var Url = {
     2  
     3     // public method for url encoding
     4     encode : function (string) {
     5         return escape(this._utf8_encode(string));
     6     },
     7  
     8     // public method for url decoding
     9     decode : function (string) {
    10         return this._utf8_decode(unescape(string));
    11     },
    12  
    13     // private method for UTF-8 encoding
    14     _utf8_encode : function (string) {
    15         string = string.replace(/\r\n/g,"\n");
    16         var utftext = "";
    17  
    18         for (var n = 0; n < string.length; n++) {
    19  
    20             var c = string.charCodeAt(n);
    21  
    22             if (c < 128) {
    23                 utftext += String.fromCharCode(c);
    24             }
    25             else if((c > 127&& (c < 2048)) {
    26                 utftext += String.fromCharCode((c >> 6| 192);
    27                 utftext += String.fromCharCode((c & 63| 128);
    28             }
    29             else {
    30                 utftext += String.fromCharCode((c >> 12| 224);
    31                 utftext += String.fromCharCode(((c >> 6& 63| 128);
    32                 utftext += String.fromCharCode((c & 63| 128);
    33             }
    34  
    35         }
    36  
    37         return utftext;
    38     },
    39  
    40     // private method for UTF-8 decoding
    41     _utf8_decode : function (utftext) {
    42         var string = "";
    43         var i = 0;
    44         var c = c1 = c2 = 0;
    45  
    46         while ( i < utftext.length ) {
    47  
    48             c = utftext.charCodeAt(i);
    49  
    50             if (c < 128) {
    51                 string += String.fromCharCode(c);
    52                 i++;
    53             }
    54             else if((c > 191&& (c < 224)) {
    55                 c2 = utftext.charCodeAt(i+1);
    56                 string += String.fromCharCode(((c & 31<< 6| (c2 & 63));
    57                 i += 2;
    58             }
    59             else {
    60                 c2 = utftext.charCodeAt(i+1);
    61                 c3 = utftext.charCodeAt(i+2);
    62                 string += String.fromCharCode(((c & 15<< 12| ((c2 & 63<< 6| (c3 & 63));
    63                 i += 3;
    64             }
    65  
    66         }
    67  
    68         return string;
    69     }
    70  
    71 }
     

    今天又被QA发现了一个urlencode的bug, 对照了一下,上面第一个函数把 "-"(中线)丢了,网上的东西不能太过于相信了。不能简单的拿来主义,仔细检查后才能使用。

  • 相关阅读:
    Linux文件属性之用户和组基础知识介绍
    企业案例-文件删除企业生产故障模拟重现(未完成待续)
    Linux文件属性之Linux文件删除重要原理详解
    Linux文件属性之软硬连接知识深度详解
    Linux文件权限基础知识
    Linux文件属性拓展知识
    Linux 文件和目录的属性及权限
    linux优化之优化开机自启动服务
    (企业面试)描述Linux系统的启动过程?
    Linux企业面试题(一)
  • 原文地址:https://www.cnblogs.com/xiaochaohuashengmi/p/1746168.html
Copyright © 2020-2023  润新知