zoukankan      html  css  js  c++  java
  • js实现php函数urlencode

    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几种编码方法对特殊符号的编码对照表:

    InputJavaScriptPHP
      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, 对照了一下,上面第一个函数把 "-"(中线)丢了,网上的东西不能太过于相信了。不能简单的拿来主义,仔细检查后才能使用。

  • 相关阅读:
    全选和选项交互
    无法将类型为excel.applicationclass的com 强制转换为接口类型的解决方法[转]
    SilverLight搭建WCF聊天室详细过程[转]
    进程与线程的一个简单解释
    Visiual Studio CLR20r3
    C#注册表操作类--完整优化版
    cmd注册外部命令
    C# Dsofile.dll无法注册运行问题解决
    .net版,微信免充值代金卷业务开通验收代码
    C#十进制与任意进制的转换
  • 原文地址:https://www.cnblogs.com/lexus/p/2405648.html
Copyright © 2011-2022 走看看