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

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

span 編輯 日本 發展 不同語言 保存 code 導致 style

ANSI碼
ANSI編碼是一種對ASCII碼的拓展:ANSI編碼用0x00~0x7f (即十進制下的0到127)範圍的1 個字節來表示 1 個英文字符,超出一個字節的 0x80~0xFFFF 範圍來表示其他語言的其他字符。也就是說,ANSI碼僅在前128(0-127)個與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保存到文件。


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