zoukankan      html  css  js  c++  java
  • 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("
    ");
    

  • 相关阅读:
    JavaScript 中,定义函数时用 var foo = function () {} 和 function foo() 有什么区别?
    Vue报错 [Vue warn]: Cannot find element
    一个android样本的过保护
    cve-2015-1635漏洞分析
    一个linux的样本分析
    ios透明代理抓包
    各浏览器抗uaf机制
    面试知识点总结之Nginx
    面试知识点总结之redis
    面试知识点总结之I/O流IO/BIO/NIO/AIO区别
  • 原文地址:https://www.cnblogs.com/CoinXu/p/4569121.html
Copyright © 2011-2022 走看看