| 前面我們說過學(xué)習(xí)netty先學(xué)基礎(chǔ),本篇討論基礎(chǔ)中的基礎(chǔ):字節(jié)和字符。 面試的時(shí)候有沒有被問到什么是字節(jié),什么是字符,字節(jié)和字符有什么區(qū)別?本篇就這個(gè)問題作一篇能夠讓你徹底了解字節(jié)字符的總結(jié)。 字節(jié)字節(jié)byte是計(jì)算機(jī)底層存儲(chǔ)和傳輸?shù)幕締挝弧?/span> 我們知道計(jì)算機(jī)是二進(jìn)制的,計(jì)算機(jī)只認(rèn)識(shí)0和1,所有的東西到了計(jì)算機(jī)的形式只能是0和1,計(jì)算機(jī)中的0和1各占一個(gè)bit位,一個(gè)字節(jié)占8個(gè)bit位,也就是一字節(jié)包含8個(gè)0或1. 字節(jié)在計(jì)算機(jī)中作為存儲(chǔ)單位和傳輸單位,而在java語言中還代表著占用1字節(jié)的基本數(shù)據(jù)類型byte. 字符所謂一切皆字符,可以這樣理解,我們能夠在一張紙上面畫出來的任何圖形,圖案,文字等等都是字符,字符可以說是無窮無盡的,有一些是無關(guān)緊要的,有一些是我們生活學(xué)習(xí)中必須具備的,比如比較常見的字符:漢字,算數(shù)符號(hào),英文字母,各國語言,甚至甲骨文等等。 編碼我們處在互聯(lián)網(wǎng)時(shí)代,如何使這些字符能夠在計(jì)算機(jī)上表示呢,這就需要一套編碼策略來實(shí)現(xiàn)。 我們知道一個(gè)字節(jié)8個(gè)bit位,他可以表示的數(shù)字是-127到128,也就是256個(gè)數(shù)字,這256個(gè)數(shù)字就是256種bit位的組合形態(tài),如果用這256個(gè)組合形態(tài)表示字符的話,最多也只能表示256個(gè)字符,那是遠(yuǎn)遠(yuǎn)不夠的,所以不難想到既然一個(gè)字節(jié)不夠,那就多個(gè)字節(jié)組合出更加豐富的bit位形態(tài),就可以表示成更多的字符,而這種利用字節(jié)中bit位組合來唯一表示某個(gè)字符的方式就是編碼格式。 常見的編碼格式說到編碼格式我們可能一下子想到ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16這些,我們分別說一下吧 ASCII編碼是最原始的編碼格式,標(biāo)準(zhǔn)的ASCII碼一共有128個(gè),占用字節(jié)的低7位,可以覆蓋全部的英語系的符號(hào),但是也僅此而已,還有太多的字符沒能覆蓋到。 ISO-8859-1編碼是ASCII編碼的一種擴(kuò)展,它用了字節(jié)的8位,能表示256種字符,且向下兼容ASCII,包含了絕大多數(shù)的西歐符號(hào)。 GB2312是雙字節(jié)編碼,意味著它使用兩個(gè)字節(jié)來表示符號(hào),包含有6763個(gè)漢字。 GBK是GB2312的一個(gè)擴(kuò)展,也是雙字節(jié)編碼,能夠表示21003個(gè)漢字,且向下兼容GB2312。 時(shí)間一長,編碼規(guī)范百花齊放,每個(gè)國家都有自己的編碼標(biāo)準(zhǔn),就導(dǎo)致自己的編碼文件只能自己去解碼,一時(shí)間亂七八糟,一不小心就出現(xiàn)亂碼,這個(gè)時(shí)候就急需要一個(gè)統(tǒng)一的標(biāo)準(zhǔn)出現(xiàn),于是國際標(biāo)準(zhǔn)化組織ISO制定了一個(gè)能夠容納世界上所有文字和符號(hào)的字符編碼方案Unicode。 Unicode是一個(gè)字符集,它規(guī)定了人類所有字符對應(yīng)的二進(jìn)制數(shù),至于這個(gè)二進(jìn)制數(shù)怎么存儲(chǔ)則是由開發(fā)者來進(jìn)行實(shí)現(xiàn)。其中比較流行的實(shí)現(xiàn)是UTF-8和UTF-16,還有一種UTF-32。 UTF-32編碼使用4個(gè)字節(jié),也就是32位二進(jìn)制存儲(chǔ)Unicode字符,效率高但是空間浪費(fèi)。 UTF-8編碼是一種變長的編碼方式,它使用1~6個(gè)字節(jié)來存儲(chǔ),對于英語系的字符使用一個(gè)字節(jié),向下兼容ASCII,對于漢字則使用兩個(gè)字節(jié),依次類推,這樣就能夠節(jié)省一定的空間。 UTF-16編碼是介于兩者之間的一種編碼方式。對于部分字符采用2個(gè)字節(jié),另一部分字符采用4個(gè)字節(jié)。因此UTF-16無法兼容ASCII。 在平時(shí)的使用中,UTF-8的使用還是比較多,就是由于它既能向下兼容ASCII,還能夠在一定程度上節(jié)省空間。 在開發(fā)中,從磁盤或者網(wǎng)卡讀取數(shù)據(jù)到內(nèi)存,或者把內(nèi)存中的數(shù)據(jù)寫入磁盤或者網(wǎng)卡,這個(gè)過程其實(shí)就伴隨著字節(jié)和字符的轉(zhuǎn)換。 | 
|  |