摘要:如果轉進制,則位進制只能表示個漢字,這個太少了。假設我們用個進制的字符,則可以表示,表示個漢字綽綽有余,但這時候需要多個字符。
項目地址: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":"u5416u963fu554a..."},這樣就不會有問題了。
如果用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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/87973.html
摘要:談談我做拼音搜索的一點經驗需要注意的一些事情本文使用的為語言解決方案。當然也我們可以自己實現轉換拼音的功能,如果這樣做,則需要在代碼中設定好中文字庫和對應的拼音,同時特別注意多音字的處理。 談談我做拼音搜索的一點經驗 需要注意的一些事情 本文使用的為 Java 語言解決方案。 搜索方法上,按照個人理解,有兩點關鍵: 分詞 將類似 women 這樣的詞分解成 women。經過這...
閱讀 2465·2021-11-19 09:40
閱讀 3593·2021-11-17 17:08
閱讀 3800·2021-09-10 10:50
閱讀 2225·2019-08-27 10:56
閱讀 1950·2019-08-27 10:55
閱讀 2646·2019-08-26 12:14
閱讀 1001·2019-08-26 11:58
閱讀 1499·2019-08-26 10:43