ASCII,Unicode 和 UTF-8的區別

字節

英文爲Byte,它是計算機信息技術中用於計量存儲容量和傳輸容量的一種計量單位,1個字節等於8位二進制,是一個很具體的存儲空間。

字符

是指計算機中使用的字母、數字、漢字和各種符號,例如1,2,3,A,B,C,~,!,·,#,¥,%,*,—,+等等。

編碼標準

談到字符,就應該要想到相關的編碼方式

ASCII

上個世紀60年代,美國製定了一套字符編碼,對英語字符與二進制位之間的關係,做了統一規定。這被稱爲 ASCII 碼,一直沿用至今。
ASCII(American Standard Code for Information Interchange:美國信息交換標準代碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言。

每一個二進制位(bit)有0和1兩種狀態,因此八個二進制位就可以組合出256種狀態,這被稱爲一個字節(byte)。也就是說,一個字節一共可以用來表示256種不同的狀態,每一個狀態對應一個符號,就是256個符號,從00000000到11111111。
ASCII 碼一共規定了128個字符的編碼,比如空格SPACE是32(二進制00100000),大寫的字母A是65(二進制01000001)。這128個符號(包括32個不能打印出來的控制符號),只佔用了一個字節的後面7位,最前面的一位統一規定爲0。

ASCII 碼使用指定的7 位或8 位二進制數組合來表示128 或256 種可能的字符。具體的可以去查看ASCII的對照表,大概信息如下:

  • 0~31及127(共33個)是控制字符或通信專用字符(其餘爲可顯示字符)
  • 32~126(共95個)是字符(32是空格),其中48~57爲0到9十個阿拉伯數字
  • 65~90爲26個大寫英文字母,97~122號爲26個小寫英文字母,其餘爲一些標點符號、運算符號等。
    ASCII是美國標準,所以它不能良好滿足其它國家的需要。

ANSI

ANSI是一種字符代碼,爲使計算機支持更多語言,通常使用 0x00~0x7f 範圍的 1 個字節來表示 1 個英文字符。超出此範圍的使用0x80~0xFFFF來編碼,即擴展的ASCII編碼。
ANSI編碼表示英文字符時用一個字節,表示中文時用兩個或四個字節。

Unicode

Universal Multiple-Octet Coded Character Set
爲了解決不同國家ANSI編碼的衝突問題,Unicode應運而生:如果全世界每一個符號都給予一個獨一無二的編碼,那麼亂碼問題就會消失。這就是Unicode,就像它的名字都表示的,這是一種所有符號的編碼。
Unicode標準也在不斷髮展,但最常用的是:用兩個字節表示一個字符,原有的英文編碼從單字節變成雙字節,只需要把高字節全部填爲0就可以。(如果要用到非常偏僻的字符,就需要4個字節)。現代操作系統和大多數編程語言都直接支持Unicode。
但是問題在於,原本可以用一個字節存儲的英文字母在Unicode裏面必須存兩個字節,這就產生了浪費。那麼有沒有一種既能消除亂碼,又能避免浪費的編碼方式呢?答案就是UTF-8!

UTF-8

UTF-8 就是在互聯網上使用最廣的一種 Unicode 的實現方式。

UTF-8 最大的一個特點,就是它是一種變長的編碼方式:它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。當字符在ASCII碼的範圍時,就用一個字節表示,保留了ASCII字符一個字節的編碼做爲它的一部分,如此一來UTF-8編碼也可以是爲視爲一種對ASCII碼的拓展。
值得注意的是unicode編碼中一箇中文字符佔2個字節,而UTF-8一箇中文字符佔3個字節。從unicode到uft-8並不是直接的對應,而是要過一些算法和規則來轉換。
在計算機內存中,統一使用Unicode編碼,當需要保存到硬盤或者需要傳輸的時候,就轉換爲UTF-8編碼。用記事本編輯的時候,從文件讀取的UTF-8字符被轉換爲Unicode字符到內存裏,編輯完成後,保存的時候再把Unicode轉換爲UTF-8保存到文件。

參考資料

Unicode 和 UTF-8 有什麼區別?
ASCII,Unicode 和 UTF-8

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