url encode,第一篇博客小记

想想真是汗颜,博客园开通了2年多了,竟然没有正式的写一篇文章;

昨天去一家公司面试,被狠狠的鄙视了一顿,还被批的一无是处;杯具啊,想想还是慢慢的提高自己吧,有口饭吃就好了,不想那么多了。专心的提高,每天用功学习一点,今天尝试写了下url encode,还是东看西抄的;不过,为了显摆一下,还是假装高雅一点,列出来个有点挑战性的参考网址吧,反正我是看着特别不爽,不过,好像也没有了更严谨的参考资料;废话少说,作为第一篇,就不那么讲究了。

URLEncode,顾名思义,就是对URL进行编码;通用的是进行UTF-8进行转码,然后使用百分比编码方式进行编码;至于什么叫UTF-8编码,就是8个二进制位进行编码吧,反正我是至于理解的;不过,为了便于区分是那8个二进制位表示一个字符,并且与原先的ASCII编码进行兼容,便是一个字节字节读取的话,如果第一个字节第一位是0的话,那么就表示,这是一个字节表示的字符,基本可以理解为这个字符是0xxxxxxx这个的,就是编码小于127的;啰嗦了半天,还是列出来一下比较直观,汗,不乱写了;

0xxxxxxx

110xxxxx 10xxxxxx

1110xxxx 10xxxxxx 10xxxxxx

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

而URL Encode就是对A-Z, a-z, -, _, ., ~这几天字符不转换之外,其他的进行UTF-8进行转码,取其16进制的表达形式,前面加上%号,所以别名又叫百分比编码方式;还有一个特别的字符就是空格,一个空格被转换为一个"+",需要特别注意;

闲言少叙,还是贴代码吧:

function encode(str) {

  str = (str || "").replace(/\r\n/g, "\n");

  var out = "", reserved = /[\w\-\.~]/g; //a-zA-Z_-.~

  for (var i = 0; i < str.length; i++) {

    var char = str[i];

     if (reserved.test(char)) {

      out += char;

     }

     else if (char === " ") {

      out += "+";

    }

    else {

      var num = str.charCodeAt(i);

      if (num <= 0x7F) {

        out += "%" + hex(num);

      }

      else if (num <= 0x7FF) {

        out += "%" + hex((num >> 6) | 0xC0);

        out += "%" + hex((num & 0x3F) | 0x80);

      }

       else if (num <= 0xFFFF) {

        out += "%" + hex((num >> 12) | 0xE0);

        out += "%" + hex(((num >> 6) & 0x3F) | 0x80);

        out += "%" + hex((num & 0x3F) | 0x80);

      }

      else { //至于那些特别大,平时也用不到,懒得写了;

        out += "%" + hex((num >> 18) | 0xF0);

        out += "%" + hex(((num >> 12) & 0x3F) | 0x80);

        out += "%" + hex(((num >> 6) & 0x3F) | 0x80);

         out += "%" + hex((num & 0x3F) | 0x80);

      }

    }

  }

  return out;

}

 

function hex(num) {

  return num.toString(16).toUpperCase();

}

参考资料:

http://en.wikipedia.org/wiki/URL_encoding

http://en.wikipedia.org/wiki/UTF-8

posted @ 2012-02-24 22:48  newdefence  阅读(291)  评论(0编辑  收藏  举报