適用對象
1于未、計算機相關(guān)類的技術(shù)人(研發(fā)宣吱、測試等)
2蓉冈、對計算機編碼感興趣的其它人士
3、想知道為什么會出現(xiàn)亂碼的人
本文的目的
本文從實用角度出發(fā)钧唐,并不會嚴格按照編碼的規(guī)范來書寫忙灼,如,字符集對應(yīng)的字符編碼名稱并不準確,但不影響讀者對編碼整體的理解该园。主要目的是讓讀者對編解碼有個初步的了解酸舍,以計算機中為什么會出現(xiàn)亂碼。
為什么需要編碼
計算機能理解的語言是二進制的(0,1)里初,人類的語言(英文父腕、中文以及其它語言)計算機是無法直接理解的,同樣青瀑,計算機的二進制語言,人類也是無法直接理解的萧诫,所以需要進行轉(zhuǎn)換斥难,這個轉(zhuǎn)換的過程就叫編解碼。
由字符到字節(jié)叫編碼帘饶,由字節(jié)到字符叫解碼哑诊。
字符集與字符編碼
計算機中存儲信息的最小單元(能表示一個具體含義的內(nèi)容,不是最小單位)是字節(jié)及刻,一個字節(jié)包括8個二進制位(最小單位是位bit)镀裤。
用一個字節(jié)表示世界上所有的語言是不夠的(2的8次方),所以人們又發(fā)明了字符的概念缴饭,用多個字節(jié)表示一個字符暑劝,不同語言有不同的字符集以及與對應(yīng)二進制的轉(zhuǎn)換關(guān)系。
字符的集合體叫做字符集颗搂,字符與二進制的轉(zhuǎn)換規(guī)則叫做編解碼担猛。很多時候,我們說的ASCII編碼丢氢,其實是包含了ASCII字符集以及其對應(yīng)的字符編碼傅联,只不過很多字符集只有一種編碼,所以才不會有問題疚察,Unicode除外蒸走。
常見的字符集與字符編碼:
| 字符集 |字符編碼 |簡單介紹 |
| ------- :| --------- :| -------- :|
| ASCII | ASCII |單字節(jié),使用了7位 |
| ISO-8859-1 | ISO-8859-1 |也叫Latin-1貌嫡,單字節(jié)比驻,擴展了ASCII,可解碼ASCII |
| GB2312 | GB2312 |小于0XFF用單字節(jié)衅枫,否則用雙字節(jié)|
| GBK | GBK |擴展GB2312嫁艇,規(guī)則同上,可解碼GB2312|
| Unicode | UTF-8 |變長1-6字節(jié)|
| Unicode | UTF-16 |雙字節(jié)|
| Unicode | UTF-32 |定長四字節(jié)|
造成亂碼的原因
通過上面了解了什么叫做編碼弦撩,以及字符集與字符編碼步咪,現(xiàn)在講一下亂碼是因為什么原因造成的。
以中文字符“我”為例益楼,我的Unicode碼是6211(UTF-16編碼猾漫,十進制是25105)点晴。
一個字符的“我”字粒督,進行GBK編碼,一個字符采用雙字節(jié)表示(小于0XFF除外)禽翼,然后再進行ISO-8859-1解碼屠橄,一個字節(jié)對應(yīng)一個字符,最終變成了兩個字符闰挡。
進行ISO-8859-1編碼,一個字符采用單字節(jié)表示长酗,6211超出了其編碼范圍溪北,所以用3f表示(未知),然后再進行ISO-8859-1解碼夺脾,一個字節(jié)對應(yīng)一個字符之拨,最終變成了1個字符的“?”咧叭。
其它編碼流程大體同上蚀乔,還有更復(fù)雜的組合場景,如菲茬,將圖1的結(jié)果再進行GBK編碼與GBK解碼(結(jié)果如何呢乙墙?)。
總之以上問題生均,都是因為在編碼與解碼的時候沒有使用合適的字符集以及對應(yīng)字符編碼才導(dǎo)致出現(xiàn)了亂碼的場景听想。
總結(jié)
本文首先介紹了什么叫做編碼,為什么我們需要編碼马胧,然后介紹了常見的字符集以及對應(yīng)的字符編碼汉买,最后介紹了亂碼的原因。讀者再理解了以上內(nèi)容之后佩脊,如果在日常工作中再遇到編碼問題蛙粘,可以根據(jù)本文的內(nèi)容進行分析,希望能幫到大家威彰。