編碼歷史

  1. 8位一個字節bytehtml

  2. 開始計算機只在美國使用,2^8=256個足以包含一些符號和英文字符了java

  3. 1968年提出ASCII碼,分爲三部分編碼

    1. 第一部分是:ASCII控制字符; 範圍0-31 終端,打印機等控制符號spa

    2. 第二部分是:ASCII打印字符; 範圍32-127 空格,英文字符等(鍵盤上能找到的)code

    3. 第三部分是:擴展ASCII打印字符。範圍128-255 擴展字符集,新的字幕,符號,還有畫表格時的橫線,豎線,交叉等htm

  4. 待中國使用計算機時,已經沒有能夠利用的字節狀態來表示漢字,何況有6000多個經常使用漢字須要保存呢。可是這難不倒智慧的中國人民,咱們不客 氣地把那些127號以後的奇異符號們直接取消掉, 規定:一個小於127的字符的意義與原來相同,但兩個大於127的字符連在一塊兒時,就表示一個漢字,前面的一個字節(他稱之爲高字節)從0xA1用到 0xF7,後面一個字節(低字節)從0xA1到0xFE,這樣咱們就能夠組合出大約7000多個簡體漢字了。在這些編碼裏,咱們還把數學符號、羅馬希臘的 字母、日文的假名們都編進去了,連在 ASCII 裏原本就有的數字、標點、字母都通通從新編了兩個字節長的編碼,這就是常說的"全角"字符,而原來在127號如下的那些就叫"半角"字符了。ip

  5. 1980年中國人民看到這樣很不錯,因而就把這種漢字方案叫作 "GB2312"。GB2312 是對 ASCII 的中文擴展。utf-8

  6. 後來又發現不夠用,因而繼續擴GB2312->GBK->GB18030unicode

    1. GB2312有6763個漢字,GBK有21003個漢字,GB18030-2000有27533個漢字,GB18030-2005有70244個漢字get

  7. 而後就是各個國家都有本身的一套編碼標準,互不兼容,怎麼辦

  8. 1990年這時一個叫 ISO (國際標誰化組織)的國際組織決定着手解決這個問題,他們採用的方法很簡單:廢了全部的地區性編碼方案,從新搞一個包括了地球上全部文化、全部字母和符號的編碼!他們打算叫它"Universal Multiple-Octet Coded Character Set",簡稱 UCS, 俗稱 "UNICODE"。並於1994年正式公佈。

    1. Unicode 1.0:1991年10月

    2. Unicode 2.0:1997年7月

    3. Unicode 3.x:1999年9月;整合ISO 10646

    4. Unicode 4.x:2003年4月

    5. Unicode 5.0:2006年7月

    6. Unicode 5.1:2008年4月

    7. Unicode 5.2:2009年10月

    8. Unicode 6.0:2010年10月

    9. Unicode 6.1:2012年1月

    10. Unicode 6.2:2012年9月

    11. Unicode 6.3:2013年11月

  9. UNICODE 中,一個字符就是兩個字節。可組合出2^16=65536個字符,這大概已經能夠覆蓋世界上全部文化的符號。若是還不夠也沒有關係,ISO已經準備 了UCS-4方案,說簡單了就是四個字節來表示一個字符,這樣咱們就能夠組合出2^31=21億個不一樣的字符出來(最高位有其餘用途),這大概能夠用到銀河聯邦成立那一天吧!(如今unicode的指定範圍爲U+0000 to U+10FFFF,後面的那麼多還待使用),須要注意的是,Unicode只是一個符號集,它只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲,下面的UTF-8是Unicode的實現方式之一

  10. UTF-8是一種針對Unicode的可變長度字符編碼,採用8bit編碼,字節數範圍爲1-6字節(中文通常都是3字節),也就是其可表達最多2^48個字符(尼瑪,這得多大啊),儘管如此,2003年11月UTF-8被RFC 3629從新規範,只能使用原來Unicode定義的區域,即U+0000 to U+10FFFF,也就是說最多4位字節(實際能夠表示的很長,可是這裏給規定死了),我以爲UTF-8受歡迎的緣由是變長這個特性,可節約空間

    1. UTF-8解析時,對於UTF-8編碼中的任意字節B

    2. 若是B的第一位爲0,則B爲ASCII碼,而且B獨立的表示一個字符;

    3. 若是B的第一位爲1,第二位爲0,則B爲一個非ASCII字符(該字符由多個字節表示)中的一個字節,而且不是字符的第一個字節編碼,須要往前或後找到第一個字節;

    4. 若是B的前兩位爲1,第三位爲0,則B爲一個非ASCII字符(該字符由多個字節表示)中的第一個字節,而且該字符由兩個字節表示;

    5. 若是B的前三位爲1,第四位爲0,則B爲一個非ASCII字符(該字符由多個字節表示)中的第一個字節,而且該字符由三個字節表示;

    6. 若是B的前四位爲1,第五位爲0,則B爲一個非ASCII字符(該字符由多個字節表示)中的第一個字節,而且該字符由四個字節表示;

  11. 另附unicode與utf-8的轉換:(大於4個字節的已給砍掉了)

    1. Unicode和UTF-8之間的轉換關係表:

    2. UCS-4編碼	          UTF-8字節流
      U+00000000 – U+0000007F	  0xxxxxxx
      U+00000080 – U+000007FF	  110xxxxx 10xxxxxx
      U+00000800 – U+0000FFFF	  1110xxxx 10xxxxxx 10xxxxxx
      U+00010000 – U+001FFFFF	  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
      U+00200000 – U+03FFFFFF	  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
      U+04000000 – U+7FFFFFFF	  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    3. 例如"漢"字的Unicode編碼是6C49。6C49在0800-FFFF之間,因此要用3字節模板:1110xxxx 10xxxxxx 10xxxxxx。將6C49寫成二進制是:0110 1100 0100 1001,將這個比特流按三字節模板的分段方法分爲0110 110001 001001,依次代替模板中的x,獲得:1110-0110 10-110001 10-001001,即E6 B1 89,這就是其UTF8的編碼。

  12. 1

相關文章
相關標籤/搜索