想想真是汗颜,博客园开通了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();
}
参考资料: