總結一下常見的幾種編碼優缺點
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碼之間不能互相轉換,這就會導致在多語言混合的文本中會有亂碼
為了解決不同國家ANSI編碼的沖突問題,Unicode應運而生:如果全世界每一個符號都給予一個獨一無二的編碼,那么亂碼問題就會消失。這就是Unicode,就像它的名字都表示的,這是一種所有符號的編碼。
Unicode標准也在不斷發展,但最常用的是用兩個字節表示一個字符(如果要用到非常偏僻的字符,就需要4個字節)。現代操作系統和大多數編程語言都直接支持Unicode。
但是問題在於,原本可以用一個字節存儲的英文字母在Unicode里面必須存兩個字節(規則就是在原來英文字母對應ASCII碼前面補0),這就產生了浪費。那么有沒有一種既能消除亂碼,又能避免浪費的編碼方式呢?答案就是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保存到文件。
GBK 擴展中文GB編碼(兼容了GB2312)更全
編碼方式:兩個字節表示一個漢字
英文字母或半角標點占用一個字節
Unicode:國際組織編碼,容納世界上所有的文字和符號的字符編碼
(1)包括UTF-32編碼
每個字符用一個int來表示 abcd 需要占用4個int
特點:簡單,太浪費空間
(2)UTF-16編碼
特點:用1到2個short來表示一個字符
(3)UTF-8 編碼
用1到4個字節來表示一個字符(比較節省空間)
如果這個字符小(在000000-00007F之間)則用一個字節 ,一次類推如果該字符比較大比如漢字(數就比較大)占用兩個字節,這個字符如果在大就用三個字節