字符是人們常用的一些記號,比如”1”, “漢”, “お”,”℃”等等,包括各種語系的語言和一些符號都可以被稱為字符。
字節是計算機存儲數據的存儲單元,是一個8位的二進制數,所以最多只能表示256個數字(0-255)。
編碼是大家對計算機如何使用字節來表示一個字符的約定,可分為ASCII編碼,ANSI編碼(本地化編碼),UNICODE編碼(國際化編碼)三種。
1.ASCII編碼:單字節編碼
最初的編碼,由一個字節組成,因此只能表示256個字符,但只表示0-9,a-z,A-Z,和一些加減乘除百分號,夠老美用了。
后來ISO國際標準組織以ASCII編碼為基礎,約定了ISO 8859-1編碼,又稱Latin1編碼。
2.ANSI編碼:多字節編碼
如果只有ASCII編碼的話,計算機豈不只能表示英文字母和數字還有幾個加減乘除號,中文怎么辦,阿拉伯文怎么辦,日文怎么辦?
由于一個字節只能表示255個數字,所以中國約定了GBK編碼規則,約定用0x80-0xFF范圍內的某兩個字節來表示某一個中文字符。
日本約定了JIS編碼規則,他們約定0x80-0xFF范圍內的某兩個字節來表示某個日文字符。
臺灣約定了BIG5編碼規則,約定0x80-0xFF范圍內的某兩個字節表示某個繁體中文字符。
所以我們拿到了一個ANSI字節串的時候,我們還必須知道這個字節串的編碼,才能將這個字節串轉換成相應國家的字符串。
3.UNICODE編碼:寬字節編碼
(一)“字節”的定義
字節(Byte)是一種計量單位,表示數據量多少,它是計算機信息技術用于計量存儲容量的一種計量單位。
(二)“字符”的定義
字符是指計算機中使用的文字和符號,比如1、2、3、A、B、C、~!·#¥%……—*()——+、等等。
(三)“字節”與“字符”
它們完全不是一個位面的概念,所以兩者之間沒有“區別”這個說法。不同編碼里,字符和字節的對應關系不同:
①ASCII碼中,一個英文字母(不分大小寫)占一個字節的空間,一個中文漢字占兩個字節的空間。一個二進制數字序列,在計算機中作為一個數字單元,一般為8位二進制數,換算為十進制。最小值0,最大值255。
②UTF-8編碼中,一個英文字符等于一個字節,一個中文(含繁體)等于三個字節。
③Unicode編碼中,一個英文等于兩個字節,一個中文(含繁體)等于兩個字節。
符號:英文標點占一個字節,中文標點占兩個字節。舉例:英文句號“.”占1個字節的大小,中文句號“。”占2個字節的大小。
④UTF-16編碼中,一個英文字母字符或一個漢字字符存儲都需要2個字節(Unicode擴展區的一些漢字存儲需要4個字節)。
⑤UTF-32編碼中,世界上任何字符的存儲都需要4個字節。
ANSI編碼有很多種,但是都只是規定自己國家的語言,這時候出現了UNICODE編碼,該編碼類似于ANSI,使用多個字節表示一個字符,UNICODE編碼把世界上各種主要語言都進行了編碼,當然UNICDOE編碼也出現了很多種編碼方案,比如使用8個二進制位的UTF8以及使用16個二進制位的UTF16等等。