之前在十個(gè)經(jīng)驗(yàn)點(diǎn)總結(jié)中提到了utf-8蟀苛,之前也特地去了解了一些审轮,大多是懵懵懂懂,所以這里又重新上網(wǎng)搜了各種資料欧宜,看了許多大牛的博客坐榆,以下是自己的總結(jié):
字符編碼是計(jì)算機(jī)技術(shù)的基石,想要熟練使用計(jì)算機(jī)冗茸,就必須懂得一點(diǎn)字符編碼的知識(shí)席镀。
——by 某位仁兄
術(shù)語(yǔ):
- 位:bit
- 字節(jié):byte 1 byte = 8 bits
- ASCII(American Standard Code for Information Interchange):編碼標(biāo)準(zhǔn),規(guī)定了128個(gè)字符與二進(jìn)制位間的對(duì)應(yīng)關(guān)系,它同時(shí)也被國(guó)際標(biāo)準(zhǔn)化組織(International Organization for Standardization,ISO)批準(zhǔn)為國(guó)際標(biāo)準(zhǔn)ISO646
- 擴(kuò)展ASCII碼(Extened ASCII):編碼標(biāo)準(zhǔn)夏漱,規(guī)定了256個(gè)字符與二進(jìn)制位間的對(duì)應(yīng)關(guān)系
- Unicode:符號(hào)集豪诲, 為每一個(gè)字符分配一個(gè)唯一的ID
- UTF-8:互聯(lián)網(wǎng)上使用最廣的一種Unicode的實(shí)現(xiàn)方式,是一種可變長(zhǎng)的編碼方式
ASCII碼
計(jì)算機(jī)內(nèi)部,所有信息最終都是一個(gè)二進(jìn)制值挂绰。每一個(gè)二進(jìn)制位(bit)有0和1兩種狀態(tài)屎篱,八個(gè)二進(jìn)制位就可以組合256種狀態(tài),這被稱為一個(gè)字節(jié)(byte),一個(gè)字節(jié)可以表示256z種不同的符號(hào)葵蒂,00000000到11111111交播,由于計(jì)算機(jī)的先驅(qū)在美國(guó)挺尿,所以60年代咏删,美國(guó)首先制定了一套字符編碼用來(lái)表示英語(yǔ)字符、標(biāo)點(diǎn)等與二進(jìn)制位間的關(guān)系栓辜,這一套標(biāo)準(zhǔn)規(guī)定的編碼稱之為ASCII碼永高,其中一共規(guī)定了128個(gè)字符與二進(jìn)制位的對(duì)應(yīng)關(guān)系隧土,其只占用了一個(gè)字節(jié)的后7位提针,第一位均為0。
擴(kuò)展ASCII碼
由于英語(yǔ)和其他的符號(hào)使用128個(gè)符號(hào)編碼足夠了曹傀,但是考慮到其他的語(yǔ)言辐脖,顯然不夠,為此皆愉,國(guó)際標(biāo)準(zhǔn)化組織又制定了ISO2022標(biāo)準(zhǔn)嗜价,它規(guī)定了在保持與ISO646兼容的前提下將ASCII字符集擴(kuò)充為8位代碼的統(tǒng)一方法,ISO陸續(xù)制定了一批適用于不同地區(qū)的擴(kuò)充ASCII字符集亥啦,每種擴(kuò)充ASCII字符集分別可以擴(kuò)充128個(gè)字符炭剪,這些擴(kuò)充字符的編碼均為高位為1的8位代碼(即十進(jìn)制數(shù)128~255),稱為擴(kuò)展ASCII碼翔脱。
GB2312編碼
上面1個(gè)字節(jié)貌似可以應(yīng)付很多國(guó)家地區(qū)的語(yǔ)言表示了奴拦,但對(duì)于漢字來(lái)說,1個(gè)字節(jié)明顯不夠届吁,所以中國(guó)制定了GB2312編碼错妖,用來(lái)把中文編進(jìn)去,使用兩個(gè)字節(jié)表示一個(gè)漢字疚沐,所以理論上最多可以表示 256x256=65536 個(gè)符號(hào)暂氯。
Unicode: 為統(tǒng)一而生
經(jīng)過??描述可以發(fā)現(xiàn),各個(gè)國(guó)家地區(qū)貌似都有了不同的編碼方式痴施,導(dǎo)致各有各的標(biāo)準(zhǔn),因此在網(wǎng)絡(luò)傳輸?shù)雀鱾€(gè)方面都會(huì)發(fā)生沖突辣吃,明顯的結(jié)果就是亂碼現(xiàn)象芬探。
試想神得,如果有一種編碼,能夠?qū)⑹澜缟纤械姆?hào)都納入其中偷仿。每一個(gè)符號(hào)都給予一個(gè)獨(dú)一無(wú)二的編碼,那么亂碼問題就會(huì)消失酝静,Unicode應(yīng)運(yùn)而生。
Unicode標(biāo)準(zhǔn)在不斷發(fā)展别智,但最常用的是用2個(gè)字節(jié)表示一個(gè)字符(如果要用到非常偏僻的字符全跨,就需要4個(gè)字節(jié))
注意,注意亿遂,注意Eㄈ簟I呤!碌上!
Unicode并不涉及字符是怎么在字節(jié)中表示的浦徊,它僅僅指定了每一個(gè)字符對(duì)應(yīng)的數(shù)字,僅此而已盔性。(Unicode只是一個(gè)用來(lái)映射字符和數(shù)字的標(biāo)準(zhǔn)
。它對(duì)支持字符的數(shù)量沒有限制冕香,也不要求字符必須占兩個(gè)悉尾、三個(gè)或者其它任意數(shù)量的字節(jié)。)
UTF-8: 為節(jié)約而生
注意到构眯,使用unicode編碼的話,由于最常用的是使用2個(gè)字節(jié)猫缭,但是考慮到國(guó)際語(yǔ)言英文它褪,使用Unicode編碼比ASCII編碼需要多一倍的存儲(chǔ)空間,在存儲(chǔ)和傳輸上就十分不劃算茫打。
因此老赤,就出現(xiàn)了"可變長(zhǎng)編碼"的UTF-8編碼,UTF-8編碼是在互聯(lián)網(wǎng)上使用最廣的一種Unicode的實(shí)現(xiàn)方式
轮洋,常用的英文字母被編碼成1個(gè)字節(jié)抬旺,漢字通常是3個(gè)字節(jié),只有很生僻的字符才會(huì)被編碼成4-6個(gè)字節(jié)汉柒。
關(guān)于UTF-8的編碼規(guī)則:
1.單字節(jié)字符等同于ASCII碼
2.n個(gè)字節(jié)的字符(n>1),第一個(gè)字節(jié)的前面n位都設(shè)置為1碾褂,第n+1位設(shè)置為0,后面n-1個(gè)字節(jié)8位的前兩位設(shè)置為10嘀略,其余的二進(jìn)制位設(shè)置為該字符的Unicode碼(從后向前)
UTF-16乓诽,UTF-32
通過??可以了解到UTF-8是Unicode最普遍的一種實(shí)現(xiàn)方式,那么當(dāng)然還有其他的實(shí)現(xiàn)方式讼育,包括:
UTF-16——字符用兩個(gè)字節(jié)或四個(gè)字節(jié)表示粮宛;
UTF-32——字符用四個(gè)字節(jié)表示;
Unicode忧饭、UTF-8在計(jì)算機(jī)中的轉(zhuǎn)化
一般情況是這樣:在計(jì)算機(jī)內(nèi)存中筷畦,統(tǒng)一使用Unicode編碼,為了節(jié)省空間鳖宾,當(dāng)需要保存在硬盤
或者傳輸
的時(shí)候,就轉(zhuǎn)換為UTF-8編碼渔肩,
以記事本為例:
記事本編輯的時(shí)候拇惋,從文件讀取的UTF-8字符被轉(zhuǎn)換為Unicode字符到內(nèi)存里,編輯完成后蓉坎,保存的時(shí)候再把Unicode轉(zhuǎn)換為UTF-8保存到文件胡嘿。
小結(jié):
記住一個(gè)順序:
ASCII => EASCII => Unicode => UTF-8
參考文章:
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html——阮一峰的網(wǎng)絡(luò)日志
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431664106267f12e9bef7ee14cf6a8776a479bdec9b9000——廖雪峰關(guān)于字符串與編碼
~~~~~
這個(gè)世界上從來(lái)沒有純文本這回事,如果你想讀出一個(gè)字符串勿侯,你必須知道它的編碼
~~~~~