字符集與編碼
字符集:考慮如何將字符映射成數字ID,不考慮傳輸和存儲,只考慮每一個字符都對應唯一的數字
編碼規則:考慮如何對目標進行編碼,需要考慮傳輸和編碼單位。
ASCII碼
ASCII((American Standard Code for Information Interchange): 美國信息交換標准代碼)碼是最初美國國家標准,供不同計算機在相互通信時用作共同遵守的西文字符編碼標准。由於他出現的早,所以即是字符映射規則,也是計算機使用字符時的傳輸和存儲規則。所以即是字符集又是編碼規則。規定8個二進制位為1字節。ASCII碼長8位其中第一位為0所以其余7位可以表示2^7=128個字符。
Unicode碼
unicode碼是由ISO組織提出,對世界上所有語言字符建立的編碼,世界上每一個字符都對應唯一的一個固定長的8位十六進制編碼(稱為Code Point-碼點)。所以是一個字符集。
UTF-8碼
由於unicode碼所有常用和罕見字符均采用定長編碼,所以一些字符可能出現大量補0的情況。於是utf-8編碼出現了,它以8位為一個編碼單位/傳輸單位,采用1~4個字節的可變長的規則(英文1字節、中文3字節,utf-8通過編碼數字指定了一個字符用多少字節,方便計算機使用)對字符進行編碼。其中常用字符的編碼更短,罕見字符的編碼更長,已達到節省存儲空間的目的。是一種對於計算機的編碼規則。其對Unicode碼點的編碼方式為:
UTF-16碼
另一種編碼方式為UTF-16碼,它將Unicode碼點編碼為1個或2個16位值,每一個16位稱為一個代碼單元。存在兩種UTF-16編碼方式:高位優先與低位優先。例如16進制值:0x2122,對於低位優先,存儲順序為0x21 0x22,高位優先存儲順序則是0x22 0x21。在一個文件中可以以字節標記順序作為先導,指示UTF-16的存儲規則,如高位優先是:0xFEFF。
在Java中一個char類型大小為兩個字節,只能描述16位的值,即只可以表示一個UTF-16代碼單元。因此面對一些特殊的輔助字符時,使用char來表示它可能會出錯。
GBK/GB2312/GB18030
針對中文常用漢字(GB2312)、繁體字與字符(GBK)、多民族字符(GB18030)的字符進行的編碼規則(向下兼容),適用於漢字。為什么有了UTF-8,GBK等規則還會頻繁出現使用呢?因為它對於中文字符一般會更節省空間(中文2字符)。