utf-8子系存储方式(下)
上篇主要有以下論點:
1、utf-8編碼狀態符”0”“10”置換,這一措施損失最大的一方將是ascall碼。因為ascall字符系統有128個字符,如果狀態符為“0”時,第一字節剛好存儲整個ascall碼字符系統,如果狀態符置換為“10”,那么將會有一半的字符“被貶”第二字節,這一半字符在存儲的時候將會增加一倍的存儲量。而這一置換第二字節存儲量是之前的2倍,第三字節存儲量是之前的4倍,第四字節存儲量是之前的8倍。
2、彩虹排序,在一個變長存儲的字符系統中,如果按照命中率和使用率來進行字符編碼排序,會無形的節約存儲空間。即便節約不了空間,在查詢時也會約束查詢區間,在指定區域搜索,增加查詢效率。
3、協議字符,由于“0”和“10”置換之后,會額外多出一個值槽夾層,出現很多的編碼空位,利用協議字符的形式,將多個字符的組合形式以協議來約定編碼。如第二字節值槽夾層有2048個空位,可以約定字符組合填入空位。“static”詞語編碼為2049,然后填入對應的值槽空位。協議字符是將兩個或者多個字符合并為一個字符,這里的字符和字符編碼不同,字符屬于字符系統,而字符編碼是給某個字符一個唯一的編碼。字符合并是在存儲的角度來說的,字符合并并不代表之前的字符消失,各個字符仍然各自獨立,與協議字符共生,不過字符在應用時為同一個編碼來存儲。
4、《第一字節協議》,第一字節協議是為了狀態符“0”“10”轉換之后將常用的字符以置換的方式編入第一字節來降低損失。第一字節一共64個空位,將52個常用拉丁字母(大小寫)、10個阿拉伯數字、一個空格、一個null納入第一字節。Ascall碼中,10個阿拉伯數字、一個空格、一個null編碼已經在前063的范圍中,需要建立104條協議,將52個拉丁字母(大小寫)納入置換后的第一字節。此協議只在范圍為0127的編碼,且不在32和48~57范圍之內生效。
5、漢字與英文單詞的比較,漢字常用字符有2萬多個,英文單詞有52個字符。在utf-8存儲時,一個英文字符占一個字節,一個中文占3個字節。在書寫時,漢字以等長緊密的排列,而英文單詞需要加上空格來作為單詞的結束標志。英文字母很類似中文中的偏旁部首的基本筆畫。漢字由偏旁部首和文字結構組成,相比于英文單詞大大節約了空間。單個漢字與英文單詞的釋義都有多種,放在上下文中會有固定的意思,它們有相似的功能。然而在文字書寫上,漢字有明顯的優勢。單個漢字字符占3個字節,而一個單詞占單詞長度加空格即n+1個字節。如果令3>n+1,那么n只能小于2,也就只能是1。因此,除非是1個字母為單詞存儲會比漢字存儲空間小之外,大于2個字符的英文單詞存儲方面會略遜于漢字,因為漢字字符是由偏旁部首和文字結構組成,每個字符都已經賦予了釋義。
從utf-8追溯到Unicode,從Unicode追溯到計算機編碼,再追溯到字符系統。英語、法語、中文、日文、陰陽爻、八卦、六十四卦、計算機編碼、進制都稱之為字符系統。變長存儲的單詞是西方人的習慣,方塊字是東方人的習慣。在信息量極大的古代,為了知識傳播,中國想方設法的節省書寫方式,字符合并很早產生于漢字中,周易也是如此。“逸馬殺犬于道”就是典型的簡化知識內容的例子。我時常在想,在歐洲沒有活字印刷術之前,由于英文單詞本身的長度限制了載體存儲文字的容量,也影響了知識的傳播速度。而在宋以前的中國同樣沒有活字印刷術,中文以其獨特的結構和良好的文字表達能力,會比英文知識更利于傳播,這對于東西方社會知識的普及度和社會發展也有一定的影響。
數據以合理的方式存儲會節約存儲空間,在古代可以影響知識的傳播速度,在現在也可以節約存儲帶來的經濟開銷,因此節約是一件有益的事情。當我看到utf-8的第一字節標識符為“0”,雙字節的次字節為“10”時,想到的是為什么不去“0”和“10”置換呢?這樣可以存儲很多的空間。可能是由于歷史原因,第一字節的狀態符為“0”,這也保留了第一字節完整的ascall碼,也非常節約ascall碼的的存儲空間。也許還有一個很重要的點,就是即便置換出來了一畝三分地,能做什么用呢?如果還是按照以往的方式進行字符編碼分配,還反倒很麻煩,也損失了ascall碼的存儲效率,沒有實質性的優化進展。而協議字符可以在“0”“10”置換后帶來實質性的空間節約,但是協議字符怎樣分配效率最高呢?在不用的應用場景中,能不能去做一些適當的調整呢?我想到的是給utf-8分子系編碼存儲方式,就像Unicode分utf-8、utf-16、utf-32一樣給utf-8分子系,比如utf-8-Chinese(中文優先分配方式)、utf-8-English(英文優先分配方式,兼容《第一字節協議》)、utf-8-Chinese-FBP(兼容《第一字節協議》的utf-8-chinese)。
utf-8-Chinese(中文優先分配方式)編碼存儲方式,在“0”“10”置換后,以中文優先。首先在第二字節多出來的2048個值槽中填入最常用的2048個漢字。這樣一來原先在第三字節的漢字被移入第二字節,存儲時節約一個字節的存儲單位,這2048個漢字可以直接節約33%存儲空間。這就需要像《第一字節協議》類似的,建立《第二字節中文協議》,來保證最常用的2048個漢字可以正常置換到第二字節。此協議在基本中文編碼的范圍(ox4e00~ox9fa5)生效,保證可以正常的與Unicode和utf-8自由轉換。
其次,第三字節會多出196608個空位,可以將中國最常用的詞語以“協議字符”的形式存儲,如將“我們”一詞約定為一個空位的編碼,“中國”“改革”“政治”“經濟”“文化”等等以此類推,最常用的詞語以3個字節的存儲單位存入也會節約一定的空間。第三字節空位納入的詞語越多,越節約空間,但是也會擴大搜索范圍。因此適度納入最為合理,比如納入10000或者5000個常用詞語。此詞語最好按照使用頻率編排編碼,制定一個范圍建立《第三字節中文詞語協議》。在指定范圍之內的編碼讀取時協議生效,讀取時將對應的一個編碼拆分為獨自Unicode中文字符顯示。另外還可以在多余的空位中指定一個區間存儲成語“協議字符”,與詞語同理。
utf-8-Chinese(中文優先分配方式)編碼存儲方式的《第二字節中文協議》類似于GBK,以2個字節存儲中文,但是又解決了GBK編碼不兼容Unicode編碼的問題。utf-8-Chinese相當于utf-8、GBK、“協議字符”的混合方式,此種方式有利于提高中文的存儲效率。
utf-8-Chinese-FBP(兼容《第一字節協議》的utf-8-chinese)是為了在存儲中文的同時不損失英文存儲效率而引進《第一字節協議》,這樣可以緩解和彌補ascall碼損失的存儲效率。
utf-8-English(英文優先分配方式,兼容《第一字節協議》)編碼存儲方式,在“0”“10”置換后,以英文優先。首先在第二字節多出來的2048個值槽可以以“協議字符”的形式填入最常用的2048個英文單詞。比如開發語言的關鍵字、最常用的英文單詞等等,與《第二字節中文協議》同理,建立《第二字節英文單詞協議》,指定連續的區間范圍,在此區間范圍內生效。英文單詞在存儲是有一個很大的優勢就在于以空格為結束標志,很容易判斷單個的英文單詞,這樣在存儲時很容易做到識別單詞,讀取時再根據“協議字符”協議拆分為對應的一組Unicode英文字符。以往英文單詞存儲字節為n+1(n代表單詞的字符長度),而在《第二字節英文單詞協議》中的單位存儲字節為2+1,這樣英文存儲也可以節約很多的空間。最常用的中文和最常用的英文單詞可以囊括很大一部分常用的書寫內容,也意味著會節約很多的空間。
第三字節和第二字節類似,存儲常用的英文單詞,也同樣建立對應的讀寫協議和指定連續區間范圍,第三字節還可以類似于中文成語,指定一個連續區間建立都區協議用來存儲常用的英語俚語。
向以上一樣,不僅中文和英文,其他國家的語言如德語、法語、日語、俄羅斯語、巴西語、阿根廷語、腓尼基語、阿拉伯語都可以在utf-8存儲方式狀態碼”0””10”置換的基礎上,建立各自的協議來指定自己的文字存儲方式。Unicode之前各個獨立的語言系統編碼各不兼容,帶來了很大的問題,這才有了Unicode的誕生。而在此種方式的基礎上,多多少少可以帶來存儲上面的節約,而且可以自由的轉為utf-8和Unicode,為存儲節約成本。
以上,都是建立在utf-8存儲方式的基礎上,建立變長存儲的存儲方式,且都可以轉為utf-8存儲方式,雖然各自語言協議和算法不同,但是都可以根據Unicode或者utf-8打通各自之間相互轉換。因此將這些編碼方式稱之為:utf-8子系存儲方式。
總結
以上是生活随笔為你收集整理的utf-8子系存储方式(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最大打开文件数(文件句柄数)
- 下一篇: Maven插件 [WARNING] 'p