1. 程式人生 > >字元編碼ANSI和ASCII區別、Unicode和UTF-8區別

字元編碼ANSI和ASCII區別、Unicode和UTF-8區別

今天看了一個說法,說是入坑windows程式開發,必先掌握文字的編碼和字符集知識。本部落格就整理下資訊儲存和字元編碼的相關知識。
一.位:
計算機儲存資訊的最小單位,稱之為位(bit),音譯位元,二進位制的一個“0”或一個“1”叫一位。
二.位元組
位元組(Byte)是一種計量單位,表示資料量多少,它是計算機資訊科技用於計量儲存容量的一種計量單位,8個二進位制位組成1個位元組。在ASCII碼中,一個標準英文字母(不分大小寫)佔一個位元組位置,一個標準漢字佔二個位元組位置。
三.字元
字元是指計算機中使用的文字和符號,比如“1、2、3、A、B、C、~!·#¥%…*()+”等等。
四.ASCII碼


先從最簡單的ASCII說起吧,這個大家也熟悉:全名是American Standard Code for Information Interchange, 叫做“美國資訊交換標準碼”。ASCII碼中,一個英文字母(不分大小寫)佔一個位元組的空間,一箇中文漢字佔兩個位元組的空間。ASCII碼是目前最普及的一種字元編碼,它紮根於我們的網際網路,作業系統,鍵盤,印表機,檔案字型和印表機等。ASCII表如下:

圖片來源百度百科
圖片來源百度百科

當然,從這個名字美國資訊交換標準碼來看,ASCII碼只適用於美帝,要是用在美帝之外的國家,就不能滿足需求了。
ANSI碼
ANSI編碼是一種對ASCII碼的拓展:ANSI編碼用0x00~0x7f 範圍的1 個位元組來表示 1 個英文字元,超出一個位元組的 0x80~0xFFFF 範圍來表示其他語言的其他字元。也就是說,ANSI碼僅在前126個與ASCII碼相同,之後的字元全是某個國家語言的所有字元。值得注意的是,兩個位元組最多可以儲存的字元數目是2的16次方,即65536個字元,這對於一個語言的字元來說,絕對夠了。還有ANSI編碼其實包括很多編碼:中國製定了GB2312編碼,用來把中文編進去另外,日本把日文編到Shift_JIS裡,韓國把韓文編到Euc-kr裡,各國有各國的標準。受制於當時的條件,不同語言之間的ANSI碼之間不能互相轉換,這就會導致在多語言混合的文字中會有亂碼。
Unicode編碼


為了解決不同國家ANSI編碼的衝突問題,Unicode應運而生:如果全世界每一個符號都給予一個獨一無二的編碼,那麼亂碼問題就會消失。這就是Unicode,就像它的名字都表示的,這是一種所有符號的編碼。
Unicode標準也在不斷髮展,但最常用的是用兩個位元組表示一個字元(如果要用到非常偏僻的字元,就需要4個位元組)。現代作業系統和大多數程式語言都直接支援Unicode。
但是問題在於,原本可以用一個位元組儲存的英文字母在Unicode裡面必須存兩個位元組(規則就是在原來英文字母對應ASCII碼前面補0),這就產生了浪費。那麼有沒有一種既能消除亂碼,又能避免浪費的編碼方式呢?答案就是UTF-8!
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儲存到檔案。