一个神奇的小工具,让URL地址都变成了”ooooooooo”

一个神奇的小工具,让URL地址都变成了"ooooooooo"

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

一个神奇的小工具,让URL地址都变成了"ooooooooo"

前置知识点

在正式开始前,先了解一些需要学习的知识点。因为涉及到两个地址其实也就是字符串之间的转换,会用到一些编码和解码的能力。

将字符转为utf8数组,转换后的每个字符都有一个特定的唯一数值,比如 http 转换后的 utf8 格式数组即是 [104, 116, 116, 112]

    toUTF8Array(str) {
        var utf8 = [];
        for (var i = 0; i < str.length; i++) {
            var charcode = str.charCodeAt(i);
            if (charcode < 0x80) utf8.push(charcode);
            else if (charcode < 0x800) {
                utf8.push(0xc0 | (charcode >> 6),
                    0x80 | (charcode & 0x3f));
            }
            else if (charcode < 0xd800 || charcode >= 0xe000) {
                utf8.push(0xe0 | (charcode >> 12),
                    0x80 | ((charcode >> 6) & 0x3f),
                    0x80 | (charcode & 0x3f));
            }
            else {
                i++;
                charcode = ((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff)
                utf8.push(0xf0 | (charcode >> 18),
                    0x80 | ((charcode >> 12) & 0x3f),
                    0x80 | ((charcode >> 6) & 0x3f),
                    0x80 | (charcode & 0x3f));
            }
        }
        console.log(utf8, 'utf8');
        return utf8;
    }

上面是编码,对应下面的则是解码,将utf8数组转换为字符串,比如 [99, 111, 109] 转换后的 utf8 格式数组即是 com

    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) << 6) | (char2 & 0x3F));
                    break;
                case 14:
                    // 1110 xxxx  10xx xxxx  10xx xxxx
                    char2 = array[i++];
                    char3 = array[i++];
                    out += String.fromCharCode(((c & 0x0F) << 12) |
                        ((char2 & 0x3F) << 6) |
                        ((char3 & 0x3F) << 0));
                    break;
            }
        }

        return out;
    }

将 Number 对象以 4 进制的形式表示为字符串,toString 用的比较多,但是里面传入参数的场景比较少,这个参数 radix 是一个可选的参数,用于指定转换的进制数,范围为 2 ~ 36,如果未传入该参数,则默认使用 10 进制。

n.toString(4)

在字符串左侧填充指定字符,直到字符串达到指定长度。基本语法为 str.padStart(targetLength [, padString])

  • targetLength:必需,指定期望字符串的最小长度,如果当前字符串小于这个长度,则会在左侧使用 padString 进行填充,直到字符串达到指定长度。
  • padString:可选,指定用于填充字符串的字符,默认为 ” “(空格)。
str.padStart(4, '0')

URL 编码/解码

下面正式开始URL编码的逻辑,核心的逻辑如下:

  • 转换为utf8数组
  • 转换为4进制并左侧补0到4位数
  • 分割转换为字符串数组
  • 映射到o的不同形式
  • 再次拼接为字符串,即转换完成后的URL
// 获取utf8数组
let unversioned = this.toUTF8Array(url)
    // 转换为base 4字符串
    // padstart非常重要!否则会丢失前导0
    .map(n => n.toString(4).padStart(4, "0"))
    // 转换为字符数组
    .join("").split("")
    // 映射到o的不同形式
    .map(x => this.enc[parseInt(x)])
    // 连接成单个字符串
    .join("")

上面有两个关键点解释一下,首先映射到o的不同形式这个是什么意思呢?其实转换后的o并不是一种“o”,而是4种,只不过我们肉眼看到的效果很像,通过 encodeURI 转换后的字符可以看出来。

encodeURI('o-ο-о-ᴏ')
// o-%CE%BF-%D0%BE-%E1%B4%8F

这里其实也解释了为什么上面为什么是转换为4进制和左侧补0到四位数。因为上面代码定义的 this.enc 如下,因为总共只有四种“o”,4进制只会产生0,1,2,3,这样就可以将转换后的utf8字符一一对应上这几种特殊的“o”。

enc = ["o", "ο", "о", "ᴏ"] 

最后的效果举例转换 http 这个字符:

  • 转换为utf8数组:[ 104, 116, 116, 112 ]
  • 转换为4进制并左侧补0到4位数:['1220', '1310', '1310', '1300']
  • 分割转换为字符串数组:['1', '2', '2', '0', '1', '3', '1', '0', '1', '3', '1', '0', '1', '3', '0', '0']
  • 映射到o的不同形式:[ 'ο', 'о', 'о', 'o', 'ο', 'ᴏ', 'ο', 'o', 'ο', 'ᴏ', 'ο', 'o', 'ο', 'ᴏ', 'o', 'o' ]
  • 再次拼接为字符串,即转换完成后的URL:οооoοᴏοoοᴏοoοᴏoo

到此整个转换编码的过程就结束了,看完后是不是觉得设计的很不错,编码完后就是解码,解码就是将上面的过程倒序来一遍,恢复到最原始的URL地址。这里要注意一点的是每次解析4个字符且parseInt以4进制的方式进行解析。

// 获取url的base 4字符串表示
let b4str = ooo.split("").map(x => this.dec[x]).join("")

let utf8arr = []
// 每次解析4个字符
// 记住添加前导0的填充
for (let i = 0; i < b4str.length; i += 4)
    utf8arr.push(parseInt(b4str.substring(i, i + 4), 4))
// 返回解码后的字符串
return this.Utf8ArrayToStr(utf8arr) 

最后

到此就核心实现代码就分享结束了,看完是不是感觉并没有很复杂,基于此设计或许可以延伸出其他的字符效果,有兴趣的也可以试试看。将转码后的地址分享给你的朋友们一定会带来不一样的惊喜。

官网地址:「ooooooooooooooooooooooo.ooo」

下面是我转换的一个AI小工具地址,点击看看效果吧~

ooooooooooooooooooooooo.ooo/ooooοооoοᴏο…

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

专注前端开发,分享前端相关技术干货,公众号:南城大前端(ID: nanchengfe)

原文链接:https://juejin.cn/post/7225573912670191677 作者:南城FE

(0)
我心飞翔我心飞翔
0 0
前端食堂技术周刊第 80 期:Vite 4.3、Node.js 20、TS 5.1 Beta、Windi CSS 即将落幕
上一篇 2023年4月25日 上午11:02
@掘友们,你有一份五一假期“省钱”攻略待查看!
下一篇 2023年4月25日 上午11:12

相关推荐

  • 我在开始我的第一个 React 项目时犯的 5 个错误 2023年3月28日
  • 从Lisp到Vue、React再到 Qwit:响应式编程的发展历程 2023年4月7日
  • 如何在页面中监听“不存在”的 DOM 节点 2023年4月3日
  • Nest:依赖注入与多种 provider 提供者(六) 2024年2月27日
  • JavaScript手写题 2021年6月1日
  • 前端需要注意哪些SEO 2020年7月24日
  • 新年福利!TailWindCSS+Vite+Vue3打造个性化在线简历项目,欢迎Fork 2024年2月16日
  • 一次性讲清JS中的所有for循环 2023年5月18日
  • 详解向量的点积(dot product) 2024年1月26日
  • 你不会在项目上线后还没改完bug吧(git更新tag方法) 2024年1月5日

发表回复

登录后才能评论

近期文章

  • 一文详解比特币的P2PKH地址类型
  • 在 Vue 中实现类似 ahooks useRequest 的异步请求 Hook
  • 使用 nuqs 在 Next.js 中管理 URL 查询字符串状态
  • JavaScript的Iterator和for…of循环
  • 手把手使用Blender+ThreeJS制作跨栏小游戏
  • CSS的三大魔法特性:层叠、继承与优先级,让你的网页设计如虎添翼!
  • docusaurus中引入shiki实现代码高亮
  • 浏览器中如何获取用户网络状态
  • 完全掌握vue全家桶单元测试 : 6. 深入理解组件测试
  • InqureJS:手搓脚手架必备!让你的命令行交互花里胡哨!
  • 【vite.config.ts】(多环境配置)设置环境文件 .env.local
  • 腾讯、阿里、B站最新面经汇总,有的妥妥的凉经
  • 带你深入Vue.js开发实战,从复杂列表的样式到性能优化
  • 『Django』路由urls
  • go语言如何实现协程的抢占式调度的?
  • 字节面试:如何解决MQ消息积压问题?
  • web server apache tomcat11-16-mbean
  • web server apache tomcat11-17-default-servlet
  • ✅MySQL的脏读、幻读、不可重复度是什么
  • tailwindcss Vue项目CSS开发体验
  • 简单的题,内涵不简单
  • AOP使用案例-记录操作日志
  • 计算机基础系列 —— 虚拟机代码翻译器(2)
  • flea-common使用之本地国际化实现
  • 锁、mvcc、隔离级别、(脏读、不可重复读、幻读)理解
  • 【java】使用表达式处理数据 – Aviator
  • python数据类型-字符串
  • 原生桥接方式:深入了解JavaScript Bridge(JsBridge)
  • 邀请函 | Pulsar Meetup 深圳 2024
  • TTFB时间太长怎么办

知识题库

  • 手把手教你vue项目接入漂亮的验证码
  • 校招前端二面经典react面试题及答案_2023-03-13
  • 字节前端二面react面试题(边面边更)_2023-03-13
  • 滴滴前端一面常考vue面试题(持续更新中)_2023-03-13
  • new Vue的时候到底做了什么_2023-03-13
  • 滴滴前端高频vue面试题(边面边更)_2023-03-13
  • 为啥我要选用Element作为wljslmz.cn子系统的UI框架?
  • vue-cli 是怎么配置babel的?
  • 面试官问我按钮级别权限怎么控制,我说v-if,面试官说再见
  • Vue项目迁移小程序,实操干货分享
  • Element ui: form表单使用
  • vue中加入百度统计
  • 前端开发:如何写一手漂亮的 Vue
  • Vue-travel学习笔记
  • 前端开发者不得不知道的18个常用的网站
  • vue-awesome-swiper的用法&同一页面有多个swiper如何使用
  • 结合 Bootstrap + Vue 组件实现 Laravel 异步分页功能
  • 在 Vue.js 中通过计算属性动态设置属性值
  • Vue 组件注册:基本使用和组件嵌套
  • Vue 组件插槽:父子组件间的内容分发和插槽作用域

深圳坪山网站建设公司福建整站网站优化高速优化网站网站内容是如何优化深圳网站seo优化武汉网站怎么优化长尾词勒流网站优化团队顺德网站优化 南京优化网站盘锦软件优化网站荔湾区做网站优化六安网站优化定制黄石网站优化效果香蜜湖网站优化服务如何网站sem优化怎样昆明怎么做网站优化网站结构和优化策略如皋网站优化怎么做海阳市网站seo优化排名成华网站关键词优化公司盐城放心的网站优化马鞍山网站优化机构企业网站优化推广哪家好枣庄网站关键词优化网站建设排名优化公司汝南县网站优化公司保山网站优化排名利通区企业网站优化铜川网站关键词优化排名优化网站的方法吃惊易速达在线优化网站有用吗网站优化技巧介绍香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化