ooooooooo
的樣子,通過(guò)轉(zhuǎn)換后的地址訪問(wèn)可以轉(zhuǎn)換回到原始地址,簡(jiǎn)單流程如下圖所示。轉(zhuǎn)換的邏輯有點(diǎn)像短鏈平臺(tái)一樣,只不過(guò)這個(gè)是將你的URL地址變的很長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng),但是看著都是 ooooooooo
,很好奇是如何實(shí)現(xiàn)的,所以查閱了源碼,本文解讀其核心實(shí)現(xiàn)邏輯,很有趣且巧妙的實(shí)現(xiàn)了這個(gè)功能。在正式開(kāi)始前,先了解一些需要學(xué)習(xí)的知識(shí)點(diǎn)。因?yàn)樯婕暗絻蓚€(gè)地址其實(shí)也就是字符串之間的轉(zhuǎn)換,會(huì)用到一些編碼和解碼的能力。
(資料圖片)
將字符轉(zhuǎn)為utf8數(shù)組,轉(zhuǎn)換后的每個(gè)字符都有一個(gè)特定的唯一數(shù)值,比如 http
轉(zhuǎn)換后的 utf8 格式數(shù)組即是 [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; }
上面是編碼,對(duì)應(yīng)下面的則是解碼,將utf8數(shù)組轉(zhuǎn)換為字符串,比如[99, 111, 109]
轉(zhuǎn)換后的 utf8 格式數(shù)組即是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 對(duì)象以 4 進(jìn)制的形式表示為字符串,toString 用的比較多,但是里面?zhèn)魅雲(yún)?shù)的場(chǎng)景比較少,這個(gè)參數(shù) radix 是一個(gè)可選的參數(shù),用于指定轉(zhuǎn)換的進(jìn)制數(shù),范圍為 2 ~ 36,如果未傳入該參數(shù),則默認(rèn)使用 10 進(jìn)制。
n.toString(4)
在字符串左側(cè)填充指定字符,直到字符串達(dá)到指定長(zhǎng)度。基本語(yǔ)法為 str.padStart(targetLength [, padString])
。
str.padStart(4, "0")
下面正式開(kāi)始URL編碼的邏輯,核心的邏輯如下:
// 獲取utf8數(shù)組let unversioned = this.toUTF8Array(url) // 轉(zhuǎn)換為base 4字符串 // padstart非常重要!否則會(huì)丟失前導(dǎo)0 .map(n => n.toString(4).padStart(4, "0")) // 轉(zhuǎn)換為字符數(shù)組 .join("").split("") // 映射到o的不同形式 .map(x => this.enc[parseInt(x)]) // 連接成單個(gè)字符串 .join("")上面有兩個(gè)關(guān)鍵點(diǎn)解釋一下,首先映射到o的不同形式這個(gè)是什么意思呢?其實(shí)轉(zhuǎn)換后的o并不是一種“o”,而是4種,只不過(guò)我們?nèi)庋劭吹降男Ч芟?,通過(guò)
encodeURI
轉(zhuǎn)換后的字符可以看出來(lái)。encodeURI("o-ο-о-?")// o-%CE%BF-%D0%BE-%E1%B4%8F
這里其實(shí)也解釋了為什么上面為什么是轉(zhuǎn)換為4進(jìn)制和左側(cè)補(bǔ)0到四位數(shù)。因?yàn)樯厦娲a定義的this.enc
如下,因?yàn)榭偣仓挥兴姆N“o”,4進(jìn)制只會(huì)產(chǎn)生0,1,2,3
,這樣就可以將轉(zhuǎn)換后的utf8字符一一對(duì)應(yīng)上這幾種特殊的“o”。
enc = ["o", "ο", "о", "?"]
最后的效果舉例轉(zhuǎn)換 http
這個(gè)字符:
[ 104, 116, 116, 112 ]
["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ο?οoο?οoο?oo
到此整個(gè)轉(zhuǎn)換編碼的過(guò)程就結(jié)束了,看完后是不是覺(jué)得設(shè)計(jì)的很不錯(cuò),編碼完后就是解碼,解碼就是將上面的過(guò)程倒序來(lái)一遍,恢復(fù)到最原始的URL地址。這里要注意一點(diǎn)的是每次解析4個(gè)字符且parseInt
以4進(jìn)制的方式進(jìn)行解析。
// 獲取url的base 4字符串表示let b4str = ooo.split("").map(x => this.dec[x]).join("")let utf8arr = []// 每次解析4個(gè)字符// 記住添加前導(dǎo)0的填充for (let i = 0; i < b4str.length; i += 4) utf8arr.push(parseInt(b4str.substring(i, i + 4), 4))// 返回解碼后的字符串return this.Utf8ArrayToStr(utf8arr)
到此就核心實(shí)現(xiàn)代碼就分享結(jié)束了,看完是不是感覺(jué)并沒(méi)有很復(fù)雜,基于此設(shè)計(jì)或許可以延伸出其他的字符效果,有興趣的也可以試試看。將轉(zhuǎn)碼后的地址分享給你的朋友們一定會(huì)帶來(lái)不一樣的驚喜。
下面是我轉(zhuǎn)換的一個(gè)AI小工具地址,點(diǎn)擊看看效果吧~
ooooooooooooooooooooooo.ooo/ooooοооoο?ο…
標(biāo)簽:
這里給大家分享我在網(wǎng)上總結(jié)出來(lái)的一些知識(shí),希望對(duì)大家有所幫助發(fā)現(xiàn)一個(gè)很有創(chuàng)意的小工具網(wǎng)站,如封面圖所
梅西中國(guó)行2023門(mén)票在哪買(mǎi)?(1)掃描二維碼至票星球微信小程序購(gòu)買(mǎi)(2)票星球App登錄購(gòu)買(mǎi)(各大應(yīng)用市場(chǎng)
合肥城建:全資子公司擬通過(guò)增資擴(kuò)股引入投資者奔匯投資 【合肥城建:全資子公司擬通過(guò)增資擴(kuò)股引入投
初次認(rèn)識(shí)溫智淞的時(shí)候他還是一名初露鋒芒的大二學(xué)生,參與創(chuàng)作表演的情景歌舞《瓦西里的故事》在中央電視臺(tái)
利通電子(SH603629,收盤(pán)價(jià):27 03元)6月2日晚間發(fā)布公告稱(chēng),江蘇利通電子股份有限公司股票于2023年5月31
5月31日晚8點(diǎn)京東618全面開(kāi)啟,攜手廠商合作伙伴為用戶(hù)提供海量超值好物與貼心服務(wù),帶來(lái)“多、快、好、省
原標(biāo)題:探索“家庭保護(hù)”新模式促“案結(jié)事了家和”北京市高級(jí)人民法院未成年人案件綜合審判庭庭長(zhǎng)陳偉紅北
人民網(wǎng)重慶6月2日電(陳琦)近日,經(jīng)過(guò)4小時(shí)30分鐘,重慶愛(ài)心小伙沅朗(化名)成功在定點(diǎn)采集醫(yī)院成功捐獻(xiàn)造血
北京龐各莊西瓜種植歷史已有600多年,是北京特色產(chǎn)業(yè)。
馬龍:已不必每場(chǎng)都稱(chēng)贊小波特防守了他做了我們需要他做的一切,小波特,熱火隊(duì),乒乓球比賽,nba總決賽,奧林匹
換新貌,待客來(lái)_當(dāng)前報(bào)道
6月2日,青島市北區(qū)登州路啤酒街上,全新的店招門(mén)頭展現(xiàn)著啤酒街改造中的新貌。為了讓啤酒街的功能、空間和
快看點(diǎn)丨融法于景,潤(rùn)物無(wú)聲!李滄區(qū)
為深入貫徹落實(shí)“八五”普法規(guī)劃,創(chuàng)新青少年法治教育形式,提高法治教育質(zhì)效。6月2日,李滄區(qū)司法局在象耳
膠州市稅務(wù)局多措并舉 推動(dòng)民法典宣
半島網(wǎng)6月2日訊(記者李京媛)今年5月是全國(guó)第三個(gè)民法典宣傳月,為進(jìn)一步加大民法典宣傳力度,對(duì)內(nèi)提高稅
焦點(diǎn)熱訊:“舌尖”上的臺(tái)東
6月2日,臺(tái)東步行街恣兒街里人來(lái)人往,許多年輕人來(lái)到這里休閑游玩,品嘗美味小吃。自恣兒街全新改造以來(lái),
山東龍大美食股份有限公司突然整體關(guān)
半島網(wǎng)6月2日訊近日,半島網(wǎng)記者收到來(lái)自山東龍大美食股份有限公司(以下簡(jiǎn)稱(chēng)龍大美食)青島辦公室員工的投
廣東2a的學(xué)校_廣東2A類(lèi)學(xué)校有哪些
大家好,小石來(lái)為大家解答以上問(wèn)題。廣東2a的學(xué)校,廣東2A類(lèi)學(xué)校有哪些這個(gè)很多人還不太了解,現(xiàn)在一起來(lái)瞧
全球觀熱點(diǎn):生查子·游雨巖_關(guān)于生
生查子·游雨巖,關(guān)于生查子·游雨巖介紹這個(gè)很多人還不知道,我們一起來(lái)看看!1、《生查子·游雨巖》是宋代
天天觀察:麥迪:我在13馬刺毫無(wú)貢獻(xiàn)
近日,NBA名宿麥迪接受了RachelNichols的采訪。談到自己的總決賽經(jīng)歷時(shí),麥迪表示:“我為波波效力過(guò),但我
6+3復(fù)式,8+3復(fù)式,集齊亮相,大樂(lè)透
彩票圈子里單式票也好,復(fù)式票也罷,想要擒獲所謂的一等獎(jiǎng),都難如登天,大海撈針一樣困難,盲目購(gòu)彩只會(huì)讓
環(huán)球聚焦:兩地通勤特省心!莞惠城際
兩地通勤特省心!莞惠城際鐵路5月到發(fā)旅客超百萬(wàn)記者從廣鐵集團(tuán)獲悉,今年5月,莞惠城際鐵路客流呈現(xiàn)快速回
廣東省會(huì)計(jì)中級(jí)資格考試考生,請(qǐng)及時(shí)
廣東省會(huì)計(jì)中級(jí)資格考試考生,請(qǐng)及時(shí)更新會(huì)計(jì)人員信息文 羊城晚報(bào)全媒體記者莫謹(jǐn)榕6月2日,羊城晚報(bào)記者從
水滸傳吳用的故事情節(jié)概括及其性格特
想必現(xiàn)在有很多小伙伴對(duì)于水滸傳吳用的故事情節(jié)方面的知識(shí)都比較想要了解,那么今天小好小編就為大家收集了
速訊:生查子·漫天春雪來(lái)_關(guān)于生查
生查子·漫天春雪來(lái),關(guān)于生查子·漫天春雪來(lái)介紹這個(gè)很多人還不知道,我們一起來(lái)看看!1、《生查子·漫天春
天天頭條:廣州隊(duì)球員凌杰社媒發(fā)文:
廣州隊(duì)球員凌杰社媒發(fā)文:做好最艱難的準(zhǔn)備,好運(yùn)6月直播吧6月2日訊廣州隊(duì)球員凌杰今天在社媒曬球隊(duì)的照片
香洲區(qū)疾病預(yù)防控制局,掛牌成立!
香洲區(qū)疾病預(yù)防控制局,掛牌成立!5月31日,香洲區(qū)疾病預(yù)防控制局掛牌儀式舉行,市衛(wèi)生健康局局長(zhǎng)徐超龍、
全球報(bào)道:關(guān)于魚(yú)兒的句子唯美_關(guān)于魚(yú)
大家好,小石來(lái)為大家解答以上問(wèn)題。關(guān)于魚(yú)兒的句子唯美,關(guān)于魚(yú)兒的句子這個(gè)很多人還不太了解,現(xiàn)在一起來(lái)
松下確認(rèn)將在美國(guó)建設(shè)第三家電池工廠
據(jù)美媒AutomotiveNews報(bào)道,松下能源CEO只信一生在昨日的公司年度業(yè)務(wù)戰(zhàn)略會(huì)議上發(fā)表了講話,并確認(rèn)松下將
全球微動(dòng)態(tài)丨不讓麥子生芽 駐馬店上
大象新聞?dòng)浾咄跸蜾h6月1日,為趕在雨前讓已經(jīng)收獲的小麥能夠及時(shí)晾曬,防止生芽,駐馬店上蔡縣9個(gè)公路道班
【全球獨(dú)家】新婚俗正在成為新潮流
【新婚俗正在成為新潮流】沒(méi)有了“天價(jià)”彩禮、豪車(chē)迎親,也沒(méi)有山珍海味,取而代之的是騎自行車(chē)帶著新娘子
當(dāng)前焦點(diǎn)!RCEP全面生效首票貨物從深
RCEP全面生效首票貨物從深圳通關(guān)深圳海關(guān)關(guān)員在皇崗口岸監(jiān)管RCEP全面生效首票貨物通關(guān)。深圳海關(guān)供圖人民網(wǎng)
安徽廬江:麥?zhǔn)諘r(shí)節(jié)搶豐糧
安徽廬江:麥?zhǔn)諘r(shí)節(jié)搶豐糧
活動(dòng)預(yù)告!下周四“e路紅帆”講壇力
半島網(wǎng)6月2日訊(記者孫貼靜)如何從0到1打造出爆款產(chǎn)品?作為新消費(fèi)品牌,“小伶鼬”如何成為風(fēng)靡全網(wǎng)的網(wǎng)
生查子·靈武寒夜_關(guān)于生查子·靈武
生查子·靈武寒夜,關(guān)于生查子·靈武寒夜介紹這個(gè)很多人還不知道,我們一起來(lái)看看!1、《生查子·靈武寒夜》
山東龍大美食股份有限公司突然整體關(guān)
半島網(wǎng)6月2日訊近日,半島網(wǎng)記者收到來(lái)自山東龍大美食股份有限公司(以下簡(jiǎn)稱(chēng)龍大美食)青島辦公室員工的投
三人籃球世界杯:中國(guó)女籃21-7打爆羅
北京時(shí)間6月2日消息,2023國(guó)際籃聯(lián)三人籃球世界杯今天繼續(xù)進(jìn)行,經(jīng)過(guò)一天的休整,中國(guó)三人籃球國(guó)家女隊(duì)狀態(tài)
文博會(huì)深圳濱海藝術(shù)中心分會(huì)場(chǎng):打造
文博會(huì)深圳濱海藝術(shù)中心分會(huì)場(chǎng):打造“灣區(qū)·視界”國(guó)際舞臺(tái)文化藝術(shù)精品交易會(huì)文博會(huì)分會(huì)場(chǎng)作為文博會(huì)的重
董勇貴_關(guān)于董勇貴的簡(jiǎn)介
音頻解說(shuō)1、董勇貴,現(xiàn)任福建省漳州市云霄縣人大常委會(huì)副主任。?本文關(guān)于董勇貴的簡(jiǎn)介就講解完畢,希望對(duì)
天天短訊!異地就醫(yī)更有“醫(yī)靠” !
為進(jìn)一步推動(dòng)跨省異地就醫(yī)直接結(jié)算工作落實(shí)落地、提高社會(huì)公眾政策知曉度,提升人民群眾異地就醫(yī)結(jié)算的獲得
當(dāng)前快報(bào):世聯(lián)賽兩連勝!中國(guó)女排3比
6月2日,2023年世界女排聯(lián)賽名古屋站繼續(xù)進(jìn)行,中國(guó)女排3比0戰(zhàn)勝德國(guó)女排,取得兩連勝。本場(chǎng)比賽,中國(guó)女排
環(huán)球速訊:6月廣州擬配置中小客車(chē)增
6月廣州擬配置中小客車(chē)增量指標(biāo)共30541個(gè)2日,廣州市中小客車(chē)指標(biāo)調(diào)控管理辦公室發(fā)布關(guān)于2023年6月份廣州市