字符編碼淺談

  計算機的一切都是二進制,而爲了助記爲了使人能直觀清楚的與計算機交互,就有了ASCII碼,使用一個字節表示英文以及一些控制符。當其他國家也開始使用計算機時,需要計算機顯示其他的字符文字,此時一個字節已不夠使用,解決的辦法是增加字節數,使用兩個字節來表示字符,即unicode。unicode兼容ASCII碼,兩者可以同時使用,此時出現一個問題,當編譯器讀取一個字節時,怎麼能判斷它是一個單獨的字節,還是兩個字節中的前一個?
  舉個例子,現在想用0-9這十個數表示3種水果:蘋果、香蕉、橘子,我們可以按自己喜好(注意這點)給它們編上號,放在一張表中,比如

編號 水果種類
0 香蕉
1 蘋果
2 橘子

  
  當後來想表示的水果種類增加時,我們就得考慮10個數可能不夠用,想增加位數來表示。比如,0-6仍表示之前定義好的水果,現在約定7-8爲標誌位,不表示任何水果,只是表明後面的數需要和標誌位一起計算,9保留以備其他用途(比如哪天我腦抽,想用它表示蔬菜了)。當讀到7或8時,暫時存起來,等讀到一個0-6的數後再組合起來計算值,查我們定義的表
此時71-76,81-86可以12種水果,

編號 水果種類
0 香蕉
1 蘋果
2 橘子
71 菠蘿
72 芒果
9 保留位

  當後來表示的規模再大些時,可以用三位數表示,此時771-886都可以用來表示水果種類。規模再大,使用位數再增加,只需遵循之前的定義遇到7和8就緩存下來,待遇到0-6的數再一起結算。
  編碼和上述過程類似,一個字節對應0-9的數,世界上包括字母方塊字等所有的需展示的字符,對應水果種類。一個字節不夠就來倆,倆不夠就來三,這就是可變長度的編碼,每個國家或組織按自己喜好做個表,就是不同的編碼集。
  由上述操作也可以很自然的聯想到操作系統中分頁分段的策略。將常用的數據直接存在0-6,這樣訪問時的速度快,將不常用且佔用內存大的數據放在多段的7-8區間,保證其數據連續完整。這也就是這種方式的實踐,根據不同數據的特點區分處理。在可變字節的編碼集中,使用頻率高的字符,在編碼時儘量使用較少的字節,不常使用的字符,可以使用字節數多的,這樣儘量減少最終生成的文本的大小。
  當然編碼工作也還有其他工作要做,比如分配標誌位、保留位的區段大小,需要權衡、向前向後兼容等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章