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