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