字符(Char):是一個信息單位歇式,在計算機(jī)里面掌眠,一個中文漢字是一個字符,一個英文字母是一個字符寥闪,一個阿拉伯?dāng)?shù)字是一個字符太惠,一個標(biāo)點(diǎn)符號也是一個字符。
字符集(Charset):是一個系統(tǒng)所支持的所有的抽象字符的集合橙垢。其中字符為各種文字和符號的總稱垛叨。
字符編碼(Character Encoding):是一套法則,使用該法則柜某,可以使自然語言中的一套字符集合 與 其他東西的一個集合進(jìn)行配對嗽元。即在符號結(jié)合和數(shù)字系統(tǒng)之間建立一套關(guān)系。通俗地講喂击,字符編碼就是將符號轉(zhuǎn)換為計算機(jī)可以接受的數(shù)字系統(tǒng)的數(shù)剂癌,稱為數(shù)字代碼。
常用的字符集:
常見的有:ASCII字符集翰绊,GB2312字符集佩谷,BIG5字符集,Unicode字符集
ASCII字符集和編碼:
ASCII是基于拉丁字母的一套編碼监嗜,主要用于現(xiàn)代英語谐檀,勉強(qiáng)支持西歐語言。
ASCII字符集:包含了控制字符(換行裁奇,退格鍵桐猬,回車鍵),可顯示字符等刽肠。
ASCII編碼:將ASCII字符集轉(zhuǎn)換為計算機(jī)可以識別的編碼規(guī)則溃肪。使用7位(bits)表示一個字符,可以支持128個字符音五。使用8位(bits)表示一個字符惫撰,共支持256個字符
ASCII編碼最大的缺點(diǎn):只能顯示26個基本的英文字符,阿拉伯?dāng)?shù)字躺涝,英式標(biāo)點(diǎn)符號等共256個字符厨钻。
GBXXXX字符集和編碼:
天朝有了計算機(jī)后,必須引入一套規(guī)則,用于將漢子轉(zhuǎn)換為計算機(jī)可以接受的數(shù)字系統(tǒng)的數(shù)莉撇。
天朝專家把127號以后的字符都取消掉呢蛤,并且規(guī)定:小于127的字符的意義與原來相同,大于127的字符棍郎,每兩個連在一起表示一個漢字其障,前面一個字節(jié)成為高字節(jié),后面一個字節(jié)成為低字節(jié)涂佃,這樣大約組合出來7000個左右的漢字励翼,在這些編碼里,連ASCII里本來就有的數(shù)字辜荠,標(biāo)點(diǎn)符號統(tǒng)統(tǒng)重寫編寫了一遍汽抚,這就是常說的“全角”“半角”字符,127以前的稱謂半角字符伯病。
特點(diǎn):采用了多字節(jié)編碼造烁,每個字可以由1,2個或者4個字節(jié)組成
BIG5字符集和編碼:
BIG5字符集主要用來表示“繁體中文”午笛,稱為大5碼惭蟋。它是一套雙字節(jié)字符集,使用了雙八碼存儲方法药磺,使用兩個字節(jié)來安放一個字告组,第一個字節(jié)稱為“高位字節(jié)”,第二個字節(jié)稱為低位字節(jié)癌佩。
偉大的創(chuàng)想-Unicode:
為了解決世界上各種語言的問題木缝,防止互相訪問出現(xiàn)亂碼的情況,產(chǎn)生了Unicode围辙。
Unicode是基于通用字符集發(fā)展的我碟,被稱為統(tǒng)一碼,萬國碼姚建。
Unicode 與 UTF-8 UTF-16 UTF-32:
簡述:Unicode是字符集怎囚,UTF-8/16/32 是三種字符編碼方案:
UTF-32:
使用4個字節(jié)(32位)的數(shù)字來表達(dá)每個字母,數(shù)字桥胞。每個數(shù)字使用4個字節(jié)來表示,就空間效率而言考婴,是非常沒有效率的贩虾。
這種方法也有優(yōu)點(diǎn),因?yàn)槠涿總€字母/數(shù)字使用4個字節(jié)數(shù)字來表示的沥阱,所以一個字符串中的第N個字符是從4*N個字節(jié)開始的缎罢,即每一個字符的長度都是固定的。
UTF-16:
盡管unicode表示的字符非常多,但是通常使用不會超過前65535個字符策精,所以舰始,UTF-16使用2個字節(jié)(16位)的數(shù)字來表示系統(tǒng)中的每個字母,數(shù)字咽袜,符號等丸卷。它最明顯的優(yōu)點(diǎn)就是空間效率上是utf-32的兩倍。
UTF-8:
UTF-8是基于Unicode的一種可變長度的字符編碼,它可以表示Unicode中的任何一個字符询刹,且編碼的第一個字節(jié)與ASCII完全兼容谜嫉。
UTF-8使用一到四個字節(jié)來表示一個字符。
(1) 128個ASCII字符凹联,只需要1個字節(jié)編碼
(2) 帶有附加符號的拉丁文沐兰,阿拉伯文等需要2個字節(jié)編碼
(3) 其他基本多文種平面,通常使用3個字節(jié)編碼
(4) 極少多食用4個字節(jié)編碼
優(yōu)點(diǎn):
UTF-8不存在字節(jié)順序的問題(UTF-16存在),一份以utf-8編碼的文件蔽挠,在不同的計算機(jī)之間住闯,是一份相同的bit流。
UTF-8是ASCII的超集澳淑,因?yàn)橐粋€純ASCII編碼的字符比原,也是一個合法的UTF-8編碼字符。
缺點(diǎn):
因?yàn)槊總€字符使用不同數(shù)量的字節(jié)編碼偶惠,所以一個字符串中想要定位一個字符的位置春寿,就會很復(fù)雜。
Unicode 轉(zhuǎn) UTF-8的規(guī)則:
比如“漢”字忽孽,其Unicode編碼是6C49绑改,6C49在 0800-FFFF之間,所以才用第三套模版轉(zhuǎn)換兄一。
6C49轉(zhuǎn)換成二進(jìn)制是0110 1100 0100 1001 ,把這個比特流轉(zhuǎn)換成第三套模版就是 0110 110001 001001
然后填充到1110xxxx 10xxxxxx 10xxxxxx中x的位置上
即為11100110 10110001 10001001 ?即E6 B1 89 這就是UTF8編碼
一個有趣的問題厘线,當(dāng)你在windows電腦桌面建立一個文本文件,輸入“聯(lián)通”兩個字后出革,重新打開造壮,會出現(xiàn)亂碼。
答:
文本文件的默認(rèn)編碼是ANSI骂束,屬于GBxx系列耳璧,每個漢字采用2個字節(jié)編碼。所以“聯(lián)通”對應(yīng)的編碼為:
可以看到第一個字符的 高位字節(jié)前三位是110 ?低位字節(jié)前2位是10
第二個字符的 高位字節(jié)前三位110展箱,低位字節(jié)前2位是10
這一下就跟UTF-8編碼的第二套規(guī)則相符合旨枯,系統(tǒng)就會認(rèn)為這是utf8編碼,然后在解碼的時候就采用了錯誤的方式混驰,導(dǎo)致了亂碼攀隔。