閱讀718 返回首頁    go 阿裏雲 go 技術社區[雲棲]


java中文亂碼解決之道(二)—–字符編碼詳解:基礎知識 + ASCII + GB**


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


計算機中存儲的信息都是用二進製表示的,我們在屏幕上所看到文字、圖片等都是通過二進製轉換的結果。編碼是信息從一種形式或格式轉換為另一種形式的過程,通俗點講就是就是將我們看到的文字、圖片等信息按照某種規則存儲在計算機中,例如‘c’在計算機中怎麼表達,‘陳’在計算機中怎麼表達,這個過程就稱之為編碼。解碼是編碼的逆過程,它是將存儲在計算機的二進製轉換為我們可以看到的文字、圖片等信息,它體現的是視覺上的刺激。

n位二進製數可以組合成2的n次方個不同的信息,給每個信息規定一個具體碼組,這種過程也叫編碼。

在編碼和解碼中,他們就如加密、解密一般,他們一定會遵循某個規則,即y = f(x),那麼x = f(y);否則在解密過程就會導致‘a’解析成‘b’或者亂碼。


字符是可使用多種不同字符方案或代碼頁來表示的抽象實體,它是一個單位的字形、類字形單位或符號的基本信息,也是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。

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



字符是各種文字和符號的總稱,而字符集則是多個字符的集合,字符集種類較多,每個字符集包含的字符個數不同。而計算機要準確的處理各種字符集文字,需要進行字符編碼,以便計算機能夠識別和存儲各種文字。

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


計算機中的信息包括數據信息和控製信息,然而不管是那種信息,他們都是以二進製編碼的方式存入計算機中,但是他們是怎麼展示在屏幕上的呢?同時在展現過程中如何才能保證他們不出錯?這個時候字符編碼就起到了重要作用!字符編碼是一套規則,一套建立在符合集合與數字係統之間的對應關係之上的規則,它是信息處理的基本技術。

使用字符編碼這套規則能夠對自然語言的字符的一個集合(如字母表或音節表),與其他東西的一個集合(如號碼或電脈衝)進行配對。



ASCII(American Standard Code for Information Interchange,美國信息交換標準代碼)是基於拉丁字母的一套電腦編碼係統。它主要用於顯示現代英語和其他西歐英語,它是現今最通用的單字節編碼係統。

ASCII使用7位或者8位來表示128或者256種可能的字符。標準的ASCII碼則是使用7位二進製數來表示所有的大小寫字母、數字、標點符合和一些控製字符,其中:

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

32~126(共95個)字符,32為空格、48~57為阿拉伯數字、65~90為大寫字母、97~122為小寫字母,其餘為一些標點符號和運算符號!

前麵提過標準的ASCII碼是使用七位來表示字符的,而最高位(b7)則是用作奇偶校驗的。所謂奇偶校驗,是指在代碼傳送過程中用來檢驗是否出現錯誤的一種方法,一般分奇校驗和偶校驗兩種。奇校驗規定:正確的代碼一個字節中1的個數必須是奇數,若非奇數,則在最高位b7添1;偶校驗規定:正確的代碼一個字節中1的個數必須是偶數,若非偶數,則在最高位b7添1。





標準的ASCII是用七位來表示的,那麼它的缺陷就非常明顯了:隻能顯示26個基本拉丁字母、阿拉伯數目字和英式標點符號,基本上隻能應用於現代美國英語,對於其他國家,128個字符肯定不夠。於是,這些歐洲國家決定利用字節中閑置的最高位編入新的符號,這樣一來,可以表達的字符數最多就為256個,但是隨著產生的問題也就來了:不同的國家有不同的字母,可能同一個編碼在不同的國家所表示的字符不同。但是不管怎麼樣,在這些編碼中0~127所表示的字符肯定是一樣的,不一樣的也隻是128~255這一段。

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



對於歐美國家來說,ASCII能夠很好的滿足用戶的需求,但是當我們中華名族使用計算機時,ASCII明顯就不滿足需求了,有5000年曆史文化的我們,擁有的漢字達到將近10萬,所以為了顯示中文,我們必須設計一套編碼規則用於將漢字轉換為計算機可以接受的數字係統的數。顯示中文的常用字符編碼有:GB2312、GBK、GB18030。


GB2312,中國國家標準簡體中文字符集,全稱《信息交換用漢字編碼字符集·基本集》,由中國國家標準總局發布,1981年5月1日實施。

GB2312編碼的規則:一個小於127的字符的意義與原來相同,但兩個大於127的字符連在一起時,就表示一個漢字,前麵的一個字節(他稱之為高字節)從0xA1用到 0xF7,後麵一個字節(低字節)從0xA1到0xFE,這樣我們就可以組合出大約7000多個簡體漢字了。在這些編碼裏,還把數學符號、羅馬希臘的 字母、日文的假名們都編進去了,連在ASCII裏本來就有的數字、標點、字母都統統重新編了兩個字節長的編碼,這就是常說的”全角”字符,而原來在127 號以下的那些就叫”半角”字符了。

在GB2312中,GB2312共收錄6763個漢字,其中一級漢字3755個,二級漢字3008個,還收錄了拉丁字母、希臘字母、日文等682個全角字符。由於GB2312的出現,它基本上解決了我們日常的需要,它所收錄的漢子已經覆蓋了中國大陸99.75%的使用平率。但是我國文化博大精深,對於人名、古漢語等方麵出現的罕用字,GB2312還是不能處理,於是後麵的GBK和GB18030漢字字符集出現了。


GBK,全稱《漢字內碼擴展規範》,由中華人民共和國全國信息技術標準化技術委員會1995年12月1日製訂,也是漢字編碼的標準之一。

GBK是GB2312的擴展,他向下與GB2312兼容,,向上支持 ISO 10646.1 國際標準,是前者向後者過渡過程中的一個承上啟下的標準。同時它是使用雙字節編碼方案,其編碼範圍從8140至FEFE(剔除xx7F),首字節在 81-FE 之間,尾字節在 40-FE 之間,共23940個碼位,共收錄了21003個漢字。


GB18030,國家標準GB18030《信息技術 中文編碼字符集》,是我國計算機係統必須遵循的基礎性標準之一。它有兩個版本:GB18030-2000、GB18030-2005。其中GB18030-2000僅規定了常用非漢字符號和27533個漢字(包括部首、部件等)的編碼,而GB18030-2005是全文強製性標準,市場上銷售的產品必須符合,它是GB18030-2000的基礎上增加了42711個漢字和多種我國少數民族文字的編碼。

GB18030標準采用單字節、雙字節和四字節三種方式對字符編碼。(碼位總體結構見下圖)

單字節部分采用GB/T 11383的編碼結構與規則,使用0×00至0×7F碼位(對應於ASCII碼的相應碼位)。雙字節部分,首字節碼位從0×81至0×FE,尾字節碼位分別是0×40至0×7E和0×80至0×FE。四字節部分采用GB/T 11383未采用的0×30到0×39作為對雙字節編碼擴充的後綴,這樣擴充的四字節編碼,其範圍為0×81308130到0×FE39FE39。其中第一、三個字節編碼碼位均為0×81至0×FE,第二、四個字節編碼碼位均為0×30至0×39。


原文鏈接

最後更新:2017-07-06 17:02:22

  上一篇:go  Docker企業版常見問題解答
  下一篇:go  ai域名火爆的原因分析