漢字轉拼音 支援20870個漢字,包含完整的多音字

2021-09-17 22:00:18 字數 1624 閱讀 2742

為了便於在網路上的傳輸,本人想辦法寫了乙個壓縮演算法,目前這個版本是壓縮好的,帶自解壓功能

以下說明壓縮思路:

理想狀態下是使用stirng.prototype.localcompare了,但是由於這玩意並不是所有瀏覽器實現都一樣,例如chrome早期的就不是按拼音排序,所以這個方案先放一邊

那網上最常見的就是碼表了,比如,這種形式的最可靠穩定,但唯一不足的是碼表太大,漢字的範圍最常用的在 \u4e00-\u9fa5 這個區間裡,其它區間的暫不考慮。這個區間有20928個漢字(後來經我簡單資料查詢,發現這個區間裡有些漢字並沒有對應的拼音,也有些漢字無法正常顯示,所以被我精簡到了20870個漢字了,當然網上也有只把常用的幾千個漢字做為碼表的)。

現在的問題就來了,如果把這2w多個漢字做為碼表存在js檔案裡無異是非常大的,我們需要想辦法壓縮,而在壓縮前我們還有些問題需要解決:

如果存放js**的檔案用utf-8來儲存,那如果這個js被放在了gbk編碼的頁面上,並且script標籤未指定charset utf-8,那麼這個js中的漢字是會亂碼的,所以需要編碼,常用的是unicode成,這樣就不會有問題了。

如果用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

漢字轉拼音

region 漢字轉拼音 漢字轉拼音類 用法 crazycoderpinyin.covent 漢字 長度 using system.text.regularexpressions build date 20030610 public class crazycoderpinyin 定義陣列 priva...

漢字轉拼音

工具pinyin4j 2.5.0.jar 整理了3個方法,1.漢字轉拼音 2.返回中文姓 中文名 英文姓 last name 英文名 first name 3.返回首字母 public class pinyin4jdemo char hanzi word.tochararray string t2 ...

漢字轉拼音

ios mac os x 漢字轉拼音 網路流行的漢字轉拼音方案是帶乙個拼音碼表,速度快。其實core foundation也提供了一種方案,而且還帶聲調!nsmutablestring ms nsmutablestring alloc initwithstring 我是中國人 if cfstring...