JavaScript转码和编码

在读Sizzle源码的时候,看到这样一个正则。identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+
想知道\x00-\xa0所表示的字符区间到底是些什么字符,与是就想到将其转为字符输出来看看。

查了一些资料,Js转解码有点麻烦。

先说转编(编码)。

  • Number对象提供了一个比较强大的函数,toString([radix])。可以将数字转为指定进制(2~36)的字符串。
  • String对象提供了一个charCodeAt(index)函数,可以将一个字符串中index位置的字符转成Unicode码。
  (80).toString(16);   // "50"
  "abc".charCodeAt(0); // 97

因为Unicode码的编码是0x0000的形式,所以如果0x之后不足四位的,需要在高位补0,凑成四位。
所以一个字符串编码的函数核心代码大致如下:

  function coding(str){
     var unic, resultSet = [], i, len = str.length, cur;
     for(i = 0; i < len; i++){
        unic = str.charCodeAt(i).toString(16);
        while(unic.length < 4){
          unic = "0" + unic;
        }
        resultSet.push("\\u" + unic);
     }
     return resultSet.join("");
  }
  coding("你好"); // "\u4f60\u597d"

再说解码。

所查资料中,得到两种解码的方法。

   var str = eval("\"" + "\u4f60\u597d" + "\"");
   console.log(str); // "你好";
  var str = unescape("\u4f60\u597d".replace(/\\u/g, "%u"));
  console.log(str); // "你好";

别问我第二种为什么要替换成"%u",我也不知道,我只能给你一个链接


有了上面的基础,可以来看下上面正则中定义的范围有哪些字符了。结果看图。

  var cache = {order: []}, i,
      reg = /\\u/g, unic, cur, html = [];
  for (i = parseInt("0x00", 16); i <= parseInt("0xa0"); i++) {
      cur = (i).toString(16);
      // 转成unicode码时,如果不足四位,需要补0
      while (cur.length < 4) {
          cur = "0" + cur;
      }
      unic = "\\u" + cur;
      cache[unic] = unescape(unic.replace(reg, "%u"));
      cache.order.push(unic);
  }
  html.push("<table>");
  for (i = 0; i < cache.order.length; i += 5) {
      html.push("<tr>");
      for (var k = 0; k < 5; k++) {
          html.push("<td>");
          html.push(cache.order[i + k]
                      ? (cache.order[i + k] + " : " + cache[cache.order[i + k]])
                      : ""
          );
          html.push("</td>");
      }
      html.push("</tr>");
  }
  html.push("<table>");
  document.body.innerHTML = html.join("\n");

posted @ 2015-06-11 14:55  _124  阅读(697)  评论(0编辑  收藏  举报