計算機編碼:ASCII,Unicode 和 UTF-8

計算機編碼:ASCII,Unicode 和 UTF-8

  1. 計算機編碼

    ​ 計算機最小存儲單元爲bit(位),有0、1兩種狀態,最小運算單元爲Byte(字節),1 Byte = 8 * bit 。那麼1Byte就有256種二進制狀態,可以代表256種字符。如果規定好人們現實生活中的字符與數量(number)的映射關係那麼即可將人類語言存儲在計算機硬件上。

  2. ASCII

    ​ ASSCII 是一個美國製定的映射標準。規定了 英文字符 <-> 數字 <->二進制表示 之間的關係。即可以將英文字符映射到byte上,ASSCII共規定了128個字符,正好使用1byte的後7個bit。第一位統一規定爲0

    ​ 例如:空格SPACE是32(二進制00100000

    ​ 大寫的字母A是65(二進制01000001

    ​ 由於世界上不單單是隻有英文,所以也需要定義漢字,日文,拉丁文等多種符號集,每個國家都在ASCII基礎上定義了自己的編碼標準,將閒置的最高位利用起來可以表示256個字符,像漢字都是上萬的字符,單字節不夠,就需要用到第二個字節。但不管怎樣每個國家的標準都是獨自的,像130在法語編碼中代表了é,在希伯來語編碼中卻代表了字母Gimel (ג),這就導致了亂碼的發生,所以出現了一個大一統的標準,Unicode

  3. Unicode

    ​ 將世界上主要符號都進行與數字的映射,一個符號對應唯一一個數學數字(通常用十六進制表示),由於範圍太大以至於對應的數字用二進制表示時,需要2個3個甚至4個字節。例如ucs-2 (unicode的一種實現方式,分爲大小端兩種)固定用兩個字節表示一個字符,那麼計算機每次都讀取兩個字節來存儲字符,記錄一個簡單字符時例如數字3,只用到了1個字節,那麼後1個字節補零,這對計算機空間是一種浪費,所以需要一種以Unicode映射關係爲基準又能根據字符動態調整佔用空間的編碼。現在互聯網主要標準爲utf-8。

  4. UTF-8

    ​ 由上述可知Unicode不適合做存儲與數據傳輸(空間浪費,帶寬浪費),而utf-8實現了一種將unicode規定的字符根據所佔用字節數動態存儲機制。UTF-8 是 Unicode 的實現方式之一。

    UTF-8 最大的一個特點,就是它是一種變長的編碼方式。它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。

    ​ UTF-8 的編碼規則很簡單,只有二條:

    1)對於單字節的符號,字節的第一位設爲0,後面7位爲這個符號的 Unicode 碼。因此對於英語字母,UTF-8 編碼和 ASCII 碼是相同的。

    2)對於n字節的符號(n > 1),第一個字節的前n位都設爲1,第n + 1位設爲0,後面字節的前兩位一律設爲10。剩下的沒有提及的二進制位,全部爲這個符號的 Unicode 碼。

    下表總結了編碼規則,字母x表示可用編碼的位。

    Unicode符號範圍(十六進制) UTF-8(二進制表示)
    0000 0000 - 0000 007F 0xxxxxxx
    0000 0080 - 0000 07FF 110xxxxx 10xxxxxx
    0000 0800 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
    0001 0000 - 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

    如上,當用utf-8解釋編碼時,如果一個字節第一位時0則表示它單獨代表一個字符,如果是1那麼連續有多少個1,就表示當前字符佔用多少個字節

    ‘嚴’的 Unicode 是4E25100111000100101),根據上表,可以發現4E25處在第三行的範圍內(0000 0800 - 0000 FFFF),因此的 UTF-8 編碼需要三個字節,即格式是1110xxxx 10xxxxxx 10xxxxxx。然後,從的最後一個二進制位開始,依次從後向前填入格式中的x,多出的位補0。這樣就得到了,的 UTF-8 編碼是11100100 10111000 10100101,轉換成十六進制就是`E4B8A5

    另外一個utf-8編碼的文件可以在文件頭用EF BB BF表示這是UTF-8編碼,後面緊跟數據,這樣的utf8編碼叫帶BOM(byte-order mark)的utf-8格式。

  5. ucs-2、ANSI

    1. ANSI是默認的編碼方式。對於英文文件是ASCII編碼,對於簡體中文文件是GB2312編碼(只針對 Windows 簡體中文版,如果是繁體中文版會採用 Big5 碼)

    2. ucs-2也是一種unicode的編碼方式,固定用兩個字節存儲字符的Unicode十六進制。根據兩個字節前後順序分大端(Big endian) 、小端(Little endian)

      以漢字爲例,Unicode 碼是4E25,需要用兩個字節存儲,一個字節是4E,另一個字節是25

      1. Big endian 時 :4E 25

      2. Little endian時:25 4E

      那麼 計算機怎麼知道某一個文件到底採用哪一種方式編碼?

      ​ Unicode 規範定義,每一個文件的最前面分別加入一個表示編碼順序的字符,這個字符的名字叫做"零寬度非換行空格"(zero width no-break space),用FEFF表示。這正好是兩個字節,而且FFFE1

      如果一個文本文件的頭兩個字節是FE FF,就表示該文件採用大頭方式;如果頭兩個字節是FF FE,就表示該文件採用小頭方式。記事本另存爲 可實現轉換。
      在這裏插入圖片描述

參考:

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

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