翼度科技»论坛 编程开发 JavaScript 查看内容

记录--让URL地址都变成了"ooooooooo"

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助




发现一个很有创意的小工具网站,如封面图所示功能很简单,就是将一个URL地址转换为都是 ooooooooo 的样子,通过转换后的地址访问可以转换回到原始地址,简单流程如下图所示。转换的逻辑有点像短链平台一样,只不过这个是将你的URL地址变的很长长长长,但是看着都是 ooooooooo,很好奇是如何实现的,所以查阅了源码,本文解读其核心实现逻辑,很有趣且巧妙的实现了这个功能。

前置知识点

在正式开始前,先了解一些需要学习的知识点。因为涉及到两个地址其实也就是字符串之间的转换,会用到一些编码和解码的能力。
将字符转为utf8数组,转换后的每个字符都有一个特定的唯一数值,比如 http 转换后的 utf8 格式数组即是 [104, 116, 116, 112]。
  1.     toUTF8Array(str) {
  2.         var utf8 = [];
  3.         for (var i = 0; i < str.length; i++) {
  4.             var charcode = str.charCodeAt(i);
  5.             if (charcode < 0x80) utf8.push(charcode);
  6.             else if (charcode < 0x800) {
  7.                 utf8.push(0xc0 | (charcode >> 6),
  8.                     0x80 | (charcode & 0x3f));
  9.             }
  10.             else if (charcode < 0xd800 || charcode >= 0xe000) {
  11.                 utf8.push(0xe0 | (charcode >> 12),
  12.                     0x80 | ((charcode >> 6) & 0x3f),
  13.                     0x80 | (charcode & 0x3f));
  14.             }
  15.             else {
  16.                 i++;
  17.                 charcode = ((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff)
  18.                 utf8.push(0xf0 | (charcode >> 18),
  19.                     0x80 | ((charcode >> 12) & 0x3f),
  20.                     0x80 | ((charcode >> 6) & 0x3f),
  21.                     0x80 | (charcode & 0x3f));
  22.             }
  23.         }
  24.         console.log(utf8, 'utf8');
  25.         return utf8;
  26.     }
复制代码
上面是编码,对应下面的则是解码,将utf8数组转换为字符串,比如 [99, 111, 109] 转换后的 utf8 格式数组即是 com。
[code]    Utf8ArrayToStr(array) {        var out, i, len, c;        var char2, char3;        out = "";        len = array.length;        i = 0;        while (i < len) {            c = array[i++];            switch (c >> 4) {                case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:                    // 0xxxxxxx                    out += String.fromCharCode(c);                    break;                case 12: case 13:                    // 110x xxxx   10xx xxxx                    char2 = array[i++];                    out += String.fromCharCode(((c & 0x1F)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具