鍍金池/ 教程/ Java/ 認(rèn)識(shí)字符集
編碼詳情
java編碼轉(zhuǎn)換過程
認(rèn)識(shí)字符集
javaWeb中的編碼解碼
認(rèn)識(shí)字符集
總結(jié)
java是如何編碼解碼的
解決URL中文亂碼問題
JSP頁(yè)面編碼過程

認(rèn)識(shí)字符集

在上篇博文(java中文亂碼解決之道(一)—–認(rèn)識(shí)字符集)中,LZ簡(jiǎn)單介紹了主流的字符編碼,對(duì)各種編碼都是點(diǎn)到為止,以下LZ將詳細(xì)闡述字符集、字符編碼等基礎(chǔ)知識(shí)和ASCII、GB的詳情。

一、基礎(chǔ)知識(shí)

在了解各種字符集之前我們需要了解一些最基礎(chǔ)的知識(shí),如:編碼、字符、字符集、字符編碼基礎(chǔ)知識(shí)。

編碼

計(jì)算機(jī)中存儲(chǔ)的信息都是用二進(jìn)制表示的,我們?cè)谄聊簧纤吹轿淖?、圖片等都是通過二進(jìn)制轉(zhuǎn)換的結(jié)果。編碼是信息從一種形式或格式轉(zhuǎn)換為另一種形式的過程,通俗點(diǎn)講就是就是將我們看到的文字、圖片等信息按照某種規(guī)則存儲(chǔ)在計(jì)算機(jī)中,例如‘c’在計(jì)算機(jī)中怎么表達(dá),‘陳’在計(jì)算機(jī)中怎么表達(dá),這個(gè)過程就稱之為編碼。解碼是編碼的逆過程,它是將存儲(chǔ)在計(jì)算機(jī)的二進(jìn)制轉(zhuǎn)換為我們可以看到的文字、圖片等信息,它體現(xiàn)的是視覺上的刺激。

n位二進(jìn)制數(shù)可以組合成2的n次方個(gè)不同的信息,給每個(gè)信息規(guī)定一個(gè)具體碼組,這種過程也叫編碼。

在編碼和解碼中,他們就如加密、解密一般,他們一定會(huì)遵循某個(gè)規(guī)則,即y = f(x),那么x = f(y);否則在解密過程就會(huì)導(dǎo)致‘a(chǎn)’解析成‘b’或者亂碼。

字符

字符是可使用多種不同字符方案或代碼頁(yè)來(lái)表示的抽象實(shí)體,它是一個(gè)單位的字形、類字形單位或符號(hào)的基本信息,也是各種文字和符號(hào)的總稱,包括各國(guó)家文字、標(biāo)點(diǎn)符號(hào)、圖形符號(hào)、數(shù)字等。

字符是指計(jì)算機(jī)中使用的字母、數(shù)字、字和符號(hào),包括:1、2、3、A、B、C、~!·#¥%……—*()——+等等。在 ASCII 編碼中,一個(gè)英文字母字符存儲(chǔ)需要1個(gè)字節(jié)。在 GB 2312 編碼或 GBK 編碼中,一個(gè)漢字字符存儲(chǔ)需要2個(gè)字節(jié)。在UTF-8編碼中,一個(gè)英文字母字符存儲(chǔ)需要1個(gè)字節(jié),一個(gè)漢字字符儲(chǔ)存需要3到4個(gè)字節(jié)。在UTF-16編碼中,一個(gè)英文字母字符或一個(gè)漢字字符存儲(chǔ)都需要2個(gè)字節(jié)(Unicode擴(kuò)展區(qū)的一些漢字存儲(chǔ)需要4個(gè)字節(jié))。在UTF-32編碼中,世界上任何字符的存儲(chǔ)都需要4個(gè)字節(jié)。

http://wiki.jikexueyuan.com/project/java-chinese-garbled-solution/images/2.1.png" alt="" />

字符集

字符是各種文字和符號(hào)的總稱,而字符集則是多個(gè)字符的集合,字符集種類較多,每個(gè)字符集包含的字符個(gè)數(shù)不同。而計(jì)算機(jī)要準(zhǔn)確的處理各種字符集文字,需要進(jìn)行字符編碼,以便計(jì)算機(jī)能夠識(shí)別和存儲(chǔ)各種文字。

常見字符集名稱:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。

字符編碼

計(jì)算機(jī)中的信息包括數(shù)據(jù)信息和控制信息,然而不管是那種信息,他們都是以二進(jìn)制編碼的方式存入計(jì)算機(jī)中,但是他們是怎么展示在屏幕上的呢?同時(shí)在展現(xiàn)過程中如何才能保證他們不出錯(cuò)?這個(gè)時(shí)候字符編碼就起到了重要作用!字符編碼是一套規(guī)則,一套建立在符合集合與數(shù)字系統(tǒng)之間的對(duì)應(yīng)關(guān)系之上的規(guī)則,它是信息處理的基本技術(shù)。

使用字符編碼這套規(guī)則能夠?qū)ψ匀徽Z(yǔ)言的字符的一個(gè)集合(如字母表或音節(jié)表),與其他東西的一個(gè)集合(如號(hào)碼或電脈沖)進(jìn)行配對(duì)。

http://wiki.jikexueyuan.com/project/java-chinese-garbled-solution/images/2.2.png" alt="" />

二、ASCII

2.1、標(biāo)準(zhǔn)ASCII碼

ASCII(American Standard Code for Information Interchange,美國(guó)信息交換標(biāo)準(zhǔn)代碼)是基于拉丁字母的一套電腦編碼系統(tǒng)。它主要用于顯示現(xiàn)代英語(yǔ)和其他西歐英語(yǔ),它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng)。

ASCII使用7位或者8位來(lái)表示128或者256種可能的字符。標(biāo)準(zhǔn)的ASCII碼則是使用7位二進(jìn)制數(shù)來(lái)表示所有的大小寫字母、數(shù)字、標(biāo)點(diǎn)符合和一些控制字符,其中:

0~31、127(共33個(gè))是控制字符或者通信專用字符,如控制符:LF(換行)、CR(回車)、DEL(刪除)等;通信專用字符:SOH(文頭)、EOT(文尾)、ACK(確認(rèn))等。ASCII值為8、9、10、13分別表示退格、制表、換號(hào)、回車字符。

32~126(共95個(gè))字符,32為空格、48~57為阿拉伯?dāng)?shù)字、65~90為大寫字母、97~122為小寫字母,其余為一些標(biāo)點(diǎn)符號(hào)和運(yùn)算符號(hào)!

前面提過標(biāo)準(zhǔn)的ASCII碼是使用七位來(lái)表示字符的,而最高位(b7)則是用作奇偶校驗(yàn)的。所謂奇偶校驗(yàn),是指在代碼傳送過程中用來(lái)檢驗(yàn)是否出現(xiàn)錯(cuò)誤的一種方法,一般分奇校驗(yàn)和偶校驗(yàn)兩種。奇校驗(yàn)規(guī)定:正確的代碼一個(gè)字節(jié)中1的個(gè)數(shù)必須是奇數(shù),若非奇數(shù),則在最高位b7添1;偶校驗(yàn)規(guī)定:正確的代碼一個(gè)字節(jié)中1的個(gè)數(shù)必須是偶數(shù),若非偶數(shù),則在最高位b7添1。 (參考百度百科)

下面是ASCII字符對(duì)照表,更多詳情請(qǐng)關(guān)注:》》 ASCII碼表《《

http://wiki.jikexueyuan.com/project/java-chinese-garbled-solution/images/2.3.png" alt="" />

http://wiki.jikexueyuan.com/project/java-chinese-garbled-solution/images/2.4.png" alt="" />

2.2、擴(kuò)展ASCII碼

標(biāo)準(zhǔn)的ASCII是用七位來(lái)表示的,那么它的缺陷就非常明顯了:只能顯示26個(gè)基本拉丁字母、阿拉伯?dāng)?shù)目字和英式標(biāo)點(diǎn)符號(hào),基本上只能應(yīng)用于現(xiàn)代美國(guó)英語(yǔ),對(duì)于其他國(guó)家,128個(gè)字符肯定不夠。于是,這些歐洲國(guó)家決定利用字節(jié)中閑置的最高位編入新的符號(hào),這樣一來(lái),可以表達(dá)的字符數(shù)最多就為256個(gè),但是隨著產(chǎn)生的問題也就來(lái)了:不同的國(guó)家有不同的字母,可能同一個(gè)編碼在不同的國(guó)家所表示的字符不同。但是不管怎么樣,在這些編碼中0~127所表示的字符肯定是一樣的,不一樣的也只是128~255這一段。

8位的ASCII在歐洲國(guó)家表現(xiàn)的不盡人意,那么在其他國(guó)家就更加不用說了,我們擁有五千年歷史文化的中華名族所包含的漢字多大10多萬(wàn),不知道是多少個(gè)256。所以一個(gè)字節(jié)8位表示的256個(gè)字符肯定是不夠的,那么兩個(gè)字節(jié)呢?可能夠了吧!我們常見的漢字就是用兩個(gè)字節(jié)表示的,如GB2312。

http://wiki.jikexueyuan.com/project/java-chinese-garbled-solution/images/2.5.jpg" alt="" />

三、GB**

對(duì)于歐美國(guó)家來(lái)說,ASCII能夠很好的滿足用戶的需求,但是當(dāng)我們中華名族使用計(jì)算機(jī)時(shí),ASCII明顯就不滿足需求了,有5000年歷史文化的我們,擁有的漢字達(dá)到將近10萬(wàn),所以為了顯示中文,我們必須設(shè)計(jì)一套編碼規(guī)則用于將漢字轉(zhuǎn)換為計(jì)算機(jī)可以接受的數(shù)字系統(tǒng)的數(shù)。顯示中文的常用字符編碼有:GB2312、GBK、GB18030。

GB2312

GB2312,中國(guó)國(guó)家標(biāo)準(zhǔn)簡(jiǎn)體中文字符集,全稱《信息交換用漢字編碼字符集·基本集》,由中國(guó)國(guó)家標(biāo)準(zhǔn)總局發(fā)布,1981年5月1日實(shí)施。

GB2312編碼的規(guī)則:一個(gè)小于127的字符的意義與原來(lái)相同,但兩個(gè)大于127的字符連在一起時(shí),就表示一個(gè)漢字,前面的一個(gè)字節(jié)(他稱之為高字節(jié))從0xA1用到 0xF7,后面一個(gè)字節(jié)(低字節(jié))從0xA1到0xFE,這樣我們就可以組合出大約7000多個(gè)簡(jiǎn)體漢字了。在這些編碼里,還把數(shù)學(xué)符號(hào)、羅馬希臘的 字母、日文的假名們都編進(jìn)去了,連在ASCII里本來(lái)就有的數(shù)字、標(biāo)點(diǎn)、字母都統(tǒng)統(tǒng)重新編了兩個(gè)字節(jié)長(zhǎng)的編碼,這就是常說的”全角”字符,而原來(lái)在127 號(hào)以下的那些就叫”半角”字符了。

在GB2312中,GB2312共收錄6763個(gè)漢字,其中一級(jí)漢字3755個(gè),二級(jí)漢字3008個(gè),還收錄了拉丁字母、希臘字母、日文等682個(gè)全角字符。由于GB2312的出現(xiàn),它基本上解決了我們?nèi)粘5男枰珍浀臐h子已經(jīng)覆蓋了中國(guó)大陸99.75%的使用平率。但是我國(guó)文化博大精深,對(duì)于人名、古漢語(yǔ)等方面出現(xiàn)的罕用字,GB2312還是不能處理,于是后面的GBK和GB18030漢字字符集出現(xiàn)了。

GB2312字符集庫(kù)非常龐大,詳情:GB2312簡(jiǎn)體中文編碼表。

GBK

GBK,全稱《漢字內(nèi)碼擴(kuò)展規(guī)范》,由中華人民共和國(guó)全國(guó)信息技術(shù)標(biāo)準(zhǔn)化技術(shù)委員會(huì)1995年12月1日制訂,也是漢字編碼的標(biāo)準(zhǔn)之一。

GBK是GB2312的擴(kuò)展,他向下與GB2312兼容,,向上支持 ISO 10646.1 國(guó)際標(biāo)準(zhǔn),是前者向后者過渡過程中的一個(gè)承上啟下的標(biāo)準(zhǔn)。同時(shí)它是使用雙字節(jié)編碼方案,其編碼范圍從8140至FEFE(剔除xx7F),首字節(jié)在 81-FE 之間,尾字節(jié)在 40-FE 之間,共23940個(gè)碼位,共收錄了21003個(gè)漢字。

GB18030

GB18030,國(guó)家標(biāo)準(zhǔn)GB18030《信息技術(shù) 中文編碼字符集》,是我國(guó)計(jì)算機(jī)系統(tǒng)必須遵循的基礎(chǔ)性標(biāo)準(zhǔn)之一。它有兩個(gè)版本:GB18030-2000、GB18030-2005。其中GB18030-2000僅規(guī)定了常用非漢字符號(hào)和27533個(gè)漢字(包括部首、部件等)的編碼,而GB18030-2005是全文強(qiáng)制性標(biāo)準(zhǔn),市場(chǎng)上銷售的產(chǎn)品必須符合,它是GB18030-2000的基礎(chǔ)上增加了42711個(gè)漢字和多種我國(guó)少數(shù)民族文字的編碼。

GB18030標(biāo)準(zhǔn)采用單字節(jié)、雙字節(jié)和四字節(jié)三種方式對(duì)字符編碼。(碼位總體結(jié)構(gòu)見下圖)

單字節(jié)部分采用GB/T 11383的編碼結(jié)構(gòu)與規(guī)則,使用0×00至0×7F碼位(對(duì)應(yīng)于ASCII碼的相應(yīng)碼位)。雙字節(jié)部分,首字節(jié)碼位從0×81至0×FE,尾字節(jié)碼位分別是0×40至0×7E和0×80至0×FE。四字節(jié)部分采用GB/T 11383未采用的0×30到0×39作為對(duì)雙字節(jié)編碼擴(kuò)充的后綴,這樣擴(kuò)充的四字節(jié)編碼,其范圍為0×81308130到0×FE39FE39。其中第一、三個(gè)字節(jié)編碼碼位均為0×81至0×FE,第二、四個(gè)字節(jié)編碼碼位均為0×30至0×39。

http://wiki.jikexueyuan.com/project/java-chinese-garbled-solution/images/2.6.jpg" alt="" />

四、參考文獻(xiàn)&進(jìn)一步閱讀

編碼:http://baike.baidu.com/subview/237708/11062012.htm(百度百科)

字符:http://baike.baidu.com/view/263416.htm(百度百科)

字符集:http://baike.baidu.com/view/51987.htm(百度百科)

字符編碼:http://baike.baidu.com/view/1204863.htm(百度百科)

字符集和字符編碼:http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html(吳秦)

ASCII:http://baike.baidu.com/view/15482.htm

GB2312:http://baike.baidu.com/view/443268.htm

GBK:http://baike.baidu.com/view/931619.htm

GB18030:http://baike.baidu.com/view/889058.htm