项目地点:https://github.com/xinglie/pi…
紧缩申明
为了便于在收集上的传输,本人想办法写了一个紧缩算法,如今这个版本是紧缩好的,带自解压功用
以下申明紧缩思绪:
抱负状态下是运用Stirng.prototype.localCompare了,然则由于这玩意并非一切浏览器完成都一样,比方chrome初期的就不是按拼音排序,所以这个计划先放一边
那网上最常见的就是码表了,比方{“a”:”吖阿啊…”},这类情势的最牢靠稳固,但唯一不足的是码表太大,汉字的局限最经常使用的在 \u4e00-\u9fa5 这个区间里,别的区间的暂不斟酌。这个区间有20928个汉字(厥后经我简朴材料查找,发明这个区间里有些汉字并没有对应的拼音,也有些汉字没法一般显现,所以被我精简到了20870个汉字了,固然网上也有只把经常使用的几千个汉字做为码表的)。
如今的题目就来了,假如把这2w多个汉字做为码表存在js文件里无异是非常大的,我们须要想办法紧缩,而在紧缩前我们还有些题目须要处理:
假如寄存js代码的文件用utf-8来保留,那假如这个js被放在了gbk编码的页面上,而且script标签未指定charset utf-8,那末这个js中的汉字是会乱码的,所以须要编码,经常使用的是unicode成{“a”:”\u5416\u963f\u554a…”},如许就不会有题目了。
假如用unicode编码,则2w多个汉字也许须要12w个字符示意(一个汉字6个字符)。怎样用字符起码的来示意这些汉字成了紧缩的症结
我们晓得每一个汉字都能够用charCodeAt取到响应的数字编码,也能够用String.fromCharCode举行复原,比方:”我”.charCodeAt(0);//20105;我们也能够用String.fromCharCode(20105)复原成”我”字,OK,到这一步,最小汉字是19968;最大是40896。假如把一切汉字用数字示意,则只须要10w个字符即可,1个汉字对应5个数字(固然,直接把这5位数字转16进制,则只须要4个就能够,2w多个汉字约莫8w个字符,依然许多)。
到这一步后,我给自已一个目的:可否用2个字符示意一个汉字?假如能够,那末也许只须要4w多字符就能够示意完,这个紧缩比对10w个字符照样相称可喜的。
既然再紧缩,那就把适才的 汉字的数字 20105再举行紧缩,这时刻我采用的是进制转换,比方把它转成64进制等尽量大的进制。假如转64进制,则2位64进制只能示意4096个汉字,这个太少了。我须要自已写一个大的进制转换,我把ascii码表从新拿出来,128个字符,除了不显现的,我挑中了从33到126之间的这些字符(除34,45,92三个外,由于我须要把顺序宣布到网上,他人能够复制粘贴之类的,所以须要可视字符),一共91个。那末91进制2位数可示意91*91=8281个,依然不够。
转头再看汉字的区间,19968-40896 假如每一个汉字都减去19968,则区间变成0-20928,假如把这个区间一分为2:0-10464 10465-20928,第二个区间每一个汉字减去10465 则变成0-10463,至此2个区间各有1w个汉字,离我们的91进制2位示意的8281比较接近了。
假定我们用3个91进制的字符,则能够示意753571,示意2w个汉字绰绰有余,但这时刻须要6w多个字符。假如我们运用91进制的2个字符,每一个区间共有2000多个没法被示意,假如盈余的这2000多个用3个字符示意,我们会发明这2000多个的高位一样(xyz),都是’x’;那末这时刻也许须要4w加上2个6000,也许5w2k个字符即可示意完成。
固然,我们要对3位的高位给一个特别的字符,如许我们再复原的时刻就很轻易复原了,这不是难事,疏忽不讲
至此,我们就完成了紧缩,末了的js约莫共58kb