常见各种编码格式
一.ANSI
這里,我將ANSI作為一個大項。根據(jù)我自己的理解,ANSI并不是一種具體的編碼,而是一種字符代碼。比如:ASCII、GB2312、GBK、GB18030等都屬于ANSI的范疇。不過這樣說也不準(zhǔn)確,根據(jù)我查閱的資料來看,ASCII是早于ANSI的,所以只能說ANSI是兼容ASCII的,而不能說ASCII是根據(jù)ANSI編碼所得。
ASCII,他的全稱為American Standard Code for Information Interchange,美國信息交換標(biāo)準(zhǔn)代碼。要知道,一個字節(jié)為8位,而8位最多可以組合256種不同的狀態(tài),用來保存英文、數(shù)字、符號完全夠用了,而事實上,ASCII只用了前128個字符。但是后來除了美國,其他的一些國家也使用了計算機(jī),但是他們的文字并非都是這些字母,所以又使用了后面的128位,又叫:”擴(kuò)展字符集“。
MBCS:就目前我查閱的資料來看,MBCS是一種統(tǒng)稱,許多漢字的編碼都屬于MBCS,比如GB2312、GBK、GB18030等。因為無論ASCII編碼如何擴(kuò)展,也滿足不了中文,中文的字?jǐn)?shù)太龐大了。MBCS支持中英文混用,英文的話就和ASCII一樣,中文的話就占2個字節(jié),GB2312的字?jǐn)?shù)最少,其規(guī)定必須2個字節(jié)都大于127才表示一個漢字;其次是GBK,其規(guī)定只要第一個字節(jié)大于127就可以了;最后是GB18030,具體編碼不清楚,好像不止2個字節(jié),但應(yīng)該是兼容GBK的,字?jǐn)?shù)比前面2個要多的多。
現(xiàn)在,再來看ANSI,叫美國國家標(biāo)準(zhǔn)協(xié)會,顧名思義是用來定義世界編碼方式的,不像ASCII,當(dāng)初創(chuàng)建的時候只是想給美國人自己用而已。ANSI的規(guī)則是,ASCII不能動,也就是說所有的ANSI標(biāo)準(zhǔn)都是兼容英文的,比如中文的GBK編碼就可以實現(xiàn)中文和英文混用。但是,每個國家自己的文字編碼就各不相同了,比如中文的ANSI編碼和日本的ANSI編碼就完全不同,所以無法實現(xiàn)中文和日文的混用。另外,只要你的編碼被ANSI認(rèn)可,以后世界上任何地方只要使用中文,就必須用中國的這一套編碼方案。
二.Unicode
根據(jù)網(wǎng)上查詢的資料來看,有的說Unicode是一種符號集,它只規(guī)定了符號的二進(jìn)制代碼,卻沒有規(guī)定這個二進(jìn)制代碼應(yīng)該如何存儲,并不是一種編碼方式。但是我們常用的TXT文檔中,明顯就有一種Unicode編碼格式,這是為什么呢?
從我目前查閱的資料來看,Unicode確實是一種符號集,可以簡寫為UCS(Unicode Character Set)。但是,Unicode也是有他自己的編碼格式的,比如UCS-2就是用兩個字節(jié)編碼、UCS-4用4個字節(jié)編碼。那么,TXT文檔中的Unicode是什么呢?其實就是UCS-2,并且是小端模式。
當(dāng)然,以上都是我查閱資料所獲取的,如果不對,麻煩告知。
所以,Unicode將全世界所有的文字等都進(jìn)行了統(tǒng)一的編碼,這樣就不會有ANSI的兼容問題。
但是Unicode一直得不到推廣。因為英文只占一個字節(jié),但是在Unicode卻要占2個字節(jié),有很大的浪費;另外,又如何去區(qū)分Unicode和ANSII呢,計算機(jī)如何知道3個字節(jié)到底是一個字符,還是3個字符呢?
直到互聯(lián)網(wǎng)的出現(xiàn),推動了Unicode的推廣。因為,互聯(lián)網(wǎng)拉近了人和人之間的距離。那么如果用ANSI的話,編碼格式太亂了。而UTF標(biāo)準(zhǔn)就出現(xiàn)了,其中UTF-8就是在互聯(lián)網(wǎng)上使用最廣的一種unicode的實現(xiàn)方式,因為他是變長的,所以極大的節(jié)省了空間,這種為傳輸而出現(xiàn)的編碼格式,使得全世界的編碼方式統(tǒng)一,非常的便利。
這里記錄下:java是雙字節(jié)編碼,采用的是UTF-16BE,中文占2個字節(jié),英文占2個字節(jié)
三.URL編碼
url編碼是一種瀏覽器用來打包表單輸入的格式,其基本格式為"key=value"這種鍵值對的,如果要傳多個參數(shù)就需要用“&”符號對鍵值對進(jìn)行分割。
URL編碼其實使用的是ascii碼的16進(jìn)制,所以,URL中只能有英文、數(shù)字還有一些特殊字符。
那我們在訪問網(wǎng)址的時候,有時候確實后面的參數(shù)有中文。這時候,就使用了encode編碼,將中文寫成%XX的格式,然后再通過decode還原成中文。當(dāng)然,不僅僅是中文,許多字符等都是這樣操作的。具體的可以自行百度。
那么這些中文,是使用的什么編碼方式轉(zhuǎn)變?yōu)?xxx的形式呢?肯定不是ASCII,因為他壓根不認(rèn)識中文。從我網(wǎng)上查詢的資料來看,貌似UTF-8占多數(shù),但好像也有GB2312這種編碼方式。
四.一個經(jīng)典的問題:TXT顯示聯(lián)通亂碼
新建一個文本文檔,在里面輸入“聯(lián)通”2個字。
然后關(guān)閉文檔,重新打開,發(fā)現(xiàn)變成亂碼了
這是為什么呢?我們再寫一個TXT文檔,寫入你好,重新打開文檔后,發(fā)現(xiàn)是可以正確顯示的,我們看一下他的編碼方式。通過“另存為”,可以發(fā)現(xiàn)編碼方式為ANSI
在看一下剛才寫的聯(lián)通,發(fā)現(xiàn)編碼方式為UTF-8,此時隱約可以知道,應(yīng)該是編碼導(dǎo)致的。
這里說一個概念:首先,計算機(jī)只認(rèn)識0和1,所以任何字符等在計算機(jī)里,都是以二進(jìn)制的形式存儲的,也就是字節(jié)的形式存儲。那么,當(dāng)計算機(jī)中的字節(jié)序列是以某種編碼格式存放的,想要將這些字節(jié)序列重新變成人所認(rèn)識的字符串,也需要使用這種編碼格式,否則會出現(xiàn)亂碼。
那么,剛才那個TXT文本,其實就是文本文件。文本文件在計算機(jī)中存儲的就是字節(jié)序列。如果我們直接在中文的電腦上創(chuàng)建一個文本文件,那么這個文本文件只認(rèn)識ANSI編碼,(這句話并不是指文本文件只認(rèn)識ANSI編碼,其實你可以將各種的編碼格式的字節(jié)存放進(jìn)去,但在中文機(jī)器上直接創(chuàng)建,就有其特殊性)。而聯(lián)通這兩個字巧了,剛好符合UTF-8的編碼格式,所以就當(dāng)做UTF-8存儲了,但重新將字節(jié)轉(zhuǎn)換為字符串的時候,是以ANSI格式轉(zhuǎn)換的,肯定是亂碼。
現(xiàn)在,你再試一下,在聯(lián)通的后面加入任意的字,比如聯(lián)通哈哈。那么,哈哈2個字和UTF-8的編碼格式不一樣的,所以仍然會作為ANSI格式存儲,就不會有問題了。
總結(jié)
- 上一篇: 大数据学习入门难,中科天玑给初学者支几招
- 下一篇: matlab 图片显示函数,matlab