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("你好"); // "u4f60u597d"

再说解码。

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

   var str = eval(""" + "u4f60u597d" + """);
   console.log(str); // "你好";
  var str = unescape("u4f60u597d".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("
");

原文地址:https://www.cnblogs.com/CoinXu/p/4569121.html