一,首先明白什么是字符,字符集,和字符編碼的概念
1,字符:字符就是我們平時(shí)用到的字符串,比如a,b,c,d和中文和一些符號(hào),阿拉伯?dāng)?shù)字等
2,字符集:字符集就是這些字符的集合,現(xiàn)在我門(mén)聊的比較多的字符集一般都有ASCII 字符集、GB2312 字符集、Unicode 字符集,UTF-8(當(dāng)然也有-16,-32后面再介紹)等
3,字符編碼:是指對(duì)于字符集中的字符,將其編碼為特定的二進(jìn)制數(shù),因?yàn)橛?jì)算機(jī)只認(rèn)識(shí)止這些二進(jìn)制數(shù),所以必須要進(jìn)行字符編碼
那么這些字符集的區(qū)別是什么呢?
1》ASCII:這個(gè)是最早的美國(guó)人用的(因?yàn)楫?dāng)時(shí)計(jì)算機(jī)就他媽在美國(guó)有,美國(guó)人發(fā)明的嗎),這個(gè)當(dāng)時(shí)因?yàn)橹辉诿绹?guó)用,所以ASCII只有128個(gè)字符,也就是英文字母的大小寫(xiě),阿拉伯?dāng)?shù)字,一些符號(hào)(空格,下劃線什么的類(lèi)似符號(hào)),這在當(dāng)時(shí)美國(guó)是完全夠用的,但是后來(lái)計(jì)算機(jī)普及到世界,這些就不夠用了,所以下面介紹的Unicode就應(yīng)運(yùn)而生了
2》Unicode:由于原來(lái)的ASCII不夠用,所以出現(xiàn)了Unicode字符集,使用十六進(jìn)制數(shù)字,而且在數(shù)字前面加上前綴 U+,比如,大寫(xiě)字母「A」的 unicode 編碼為 U+0041,漢字「嚴(yán)」的 unicode 編碼為 U+4E25。更多的符號(hào)對(duì)應(yīng)表,可以查詢(xún) unicode.org,或者專(zhuān)門(mén)的漢字對(duì)應(yīng)表。
當(dāng)然Unicode為了兼容ASCII編碼,所以他的前128個(gè)的值和ASCII是一樣的,也就是說(shuō)Unicode表示的那些英文字符 數(shù)字 符號(hào)的值和ASCII是一樣的
3》GBK 編碼:簡(jiǎn)單介紹一下,這個(gè)是當(dāng)時(shí)全世界沒(méi)有統(tǒng)一使用的編碼方式的時(shí)候我過(guò)自己針對(duì)漢子的一套編碼方案,當(dāng)時(shí)比如日本也有自己的一套編碼方案
4》UTF-8 編碼:Unicode 看起來(lái)已經(jīng)很完美了,實(shí)現(xiàn)了大一統(tǒng)。但是,Unicode 卻存在一個(gè)很大的問(wèn)題:資源浪費(fèi),資源浪費(fèi),資源浪費(fèi)(重要的事情說(shuō)三遍),為什么會(huì)有資源浪費(fèi)呢,你想,當(dāng)時(shí)ascll編碼的這些英文字母一個(gè)字節(jié)就夠了,但是比如像一些中文需要兩個(gè)字節(jié)才能表示,一些其它語(yǔ)言甚至需要四個(gè)字節(jié)才能表示,這時(shí)我門(mén)為了能表示所有的,我門(mén)都需要開(kāi)辟出來(lái)4個(gè)字節(jié)(加入最多的就是4個(gè)字節(jié)),這時(shí)豈不是造成了大量的資源浪費(fèi),所以UTF-8 編碼有應(yīng)運(yùn)而生了。
UTF-8 編碼是一種針對(duì) Unicode 的可變長(zhǎng)度字符編碼(他的英文全程是8-bit Unicode Transformation Format),他其實(shí)就是Unicode編碼的實(shí)現(xiàn)方式之一,其實(shí)Unicode還有其它編碼實(shí)現(xiàn)標(biāo)準(zhǔn)比如UTF-8,UTF-32等,它使用一到四個(gè)字節(jié)來(lái)表示字符,例如,ASCII 字符繼續(xù)使用一個(gè)字節(jié)編碼,阿拉伯文、希臘文等使用兩個(gè)字節(jié)編碼,常用漢字使用三個(gè)字節(jié)編碼,等等。
總體來(lái)說(shuō),字符編碼是干嘛的呢, 1,就是把字符轉(zhuǎn)為計(jì)算機(jī)能認(rèn)識(shí)的二進(jìn)制數(shù)據(jù),那么他怎么轉(zhuǎn)的呢,這就是下面說(shuō)的了 2,因?yàn)樗锩婺依耸澜缢械淖址?,所以什么都可以得到正確解析,都可以得到正確的且是唯一的編碼 ,所以這也就是保證了不會(huì)出現(xiàn)亂碼,會(huì)說(shuō)你在美國(guó)“helloworld”編碼的二進(jìn)制是一個(gè)值,到了中國(guó)編碼成了另一個(gè)值,這時(shí)候解析的肯定就不正確了,所以這就是統(tǒng)一的好處啊
二,關(guān)于字節(jié)
1,字節(jié)是什么?
字節(jié)就是Byte,也就是一個(gè)計(jì)算機(jī)的計(jì)量單位
2,字節(jié)的換算
ASCII碼:一個(gè)英文字母(不分大小寫(xiě))占一個(gè)字節(jié)的空間,
一個(gè)中文漢字占兩個(gè)字節(jié)的空間。
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é)的大小
數(shù)學(xué)間的運(yùn)算
1KB=1024B;1MB=1024KB=1024×1024B(B就是字節(jié)的意思,一定嚴(yán)格區(qū)分1B和bit的區(qū)別)。1B是1字節(jié),而一字節(jié)是等于8bit的
B的取值范圍是0-255,為什么會(huì)是這個(gè)區(qū)間呢,因?yàn)?B=8bit,那么8bit最小是多少呢,最小是00000000也就是0,8bit最大是多少呢也就是11111111也就是我們平時(shí)說(shuō)的ff,也就是255
所以總的來(lái)說(shuō),你說(shuō)字符和字節(jié)的關(guān)系是什么,其實(shí)沒(méi)什么特殊的關(guān)系,也就是一個(gè)字符占多少空間的問(wèn)題,字節(jié)是空間單位,一個(gè)字符占不同大小的字節(jié)空間.
三,關(guān)于字符流和字節(jié)流
1,字符流:就是通過(guò)字符編碼編成的一堆二進(jìn)制流,這里因?yàn)樗峭ㄟ^(guò)某一種特定的編碼規(guī)范編碼的,比如utf-8,所以當(dāng)你收到的時(shí)候,可以通過(guò)該編碼規(guī)范在進(jìn)行解碼,舉個(gè)例子,現(xiàn)在咱們使用的http,http的傳輸使用的字符編碼規(guī)范就是ISO8859-1,我門(mén)收到之后使用同樣的編碼規(guī)范可以解出來(lái)相應(yīng)的數(shù)據(jù)(當(dāng)然并不是網(wǎng)絡(luò)請(qǐng)求一定用ISO8859-1)
2,字節(jié)流:字節(jié)流本身就是一堆二進(jìn)制,像我門(mén)的mp3,mp4文件,他們傳輸都是字節(jié)流,他們并不需要進(jìn)行字符編碼什么的,他們只是通過(guò)來(lái)回的傳輸,然后交給計(jì)算機(jī)識(shí)別就行了