Java設(shè)置String字符串編碼方法詳解_第1頁
Java設(shè)置String字符串編碼方法詳解_第2頁
Java設(shè)置String字符串編碼方法詳解_第3頁
Java設(shè)置String字符串編碼方法詳解_第4頁
Java設(shè)置String字符串編碼方法詳解_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第Java設(shè)置String字符串編碼方法詳解目錄一.字符編碼1.編碼簡介2.常用編碼2.1ASCII編碼2.2GB2312編碼2.3Big5編碼2.4Unicode編碼2.5UTF-8編碼2.6GBK編碼二.String編碼設(shè)置1.概述2.轉(zhuǎn)換編碼三.結(jié)語

一.字符編碼

1.編碼簡介

對很多小白來說,可能不明白什么是字符編碼,也不知道為什么要有字符編碼,所以就先來給大家簡要地介紹一下字符編碼。

所謂的字符編碼(CharacterEncoding),也叫做字集碼,其實就是一種映射規(guī)則,計算機可以根據(jù)這個映射規(guī)則,將某個字符映射成其他形式的數(shù)據(jù),以便在計算機和網(wǎng)絡(luò)中進行存儲和傳輸。

例如經(jīng)典的ASCII字符編碼,就是將字母、數(shù)字和其它符號進行編號,并用7個比特的二進制作為單字節(jié)的低位,然后再加一個額外擴充的比特占據(jù)高位,形成一個完整的字節(jié),從而表示一個整數(shù)。在這個編碼規(guī)則下,字母A的編號是65(ASCII碼),用單字節(jié)表示就是0x41,而寫入到存儲設(shè)備時就是二進制的01000001。這樣,A、65、0x41、01000001這四個數(shù)據(jù)之間就有了對應(yīng)的映射關(guān)系。

有些同學(xué)就問了,怎么這么麻煩?直接把A存儲在計算機中不行嗎?這個肯定不行??!之前跟大家講解計算機基礎(chǔ)知識時就說過,計算機的底層硬件只能識別電路信號,即開和關(guān),轉(zhuǎn)換成數(shù)字就是1和0,這就是二進制的由來。也就是說,計算機底層硬件只能識別0和1這兩個數(shù)字,你給我存儲A這個字符,肯定就不行咯。但是對我們?nèi)祟悂碚f,計算機直接把一堆0101展示在我們面前,我們又不是電路板,怎么可能識別?!所以這時候就需要在人類可讀的數(shù)據(jù),與計算機底層能夠理解的數(shù)據(jù)之間有一種映射規(guī)則和關(guān)系,這種映射規(guī)則其實就是字符編碼!

2.常用編碼

現(xiàn)在我們已經(jīng)知道了字符編碼的概念及其由來,有些同學(xué)又問了,都有哪些字符編碼呢?接下來再跟大家聊幾個常用的字符編碼:

ASCII編碼GB2312編碼Big5編碼Unicode編碼UTF-8編碼GBK編碼

當(dāng)然,在實際的開發(fā)中,其實有很多種字符編碼,以上這幾個只是比較常用的字符編碼。

2.1ASCII編碼

ASCII(AmericanStandardCodeforInformationInterchange,美國信息交換標準碼),是基于拉丁字母的字符編碼系統(tǒng),主要用于顯示現(xiàn)代英語和其他西歐語言。它是現(xiàn)今最通用、最經(jīng)典的單字節(jié)編碼系統(tǒng),大多數(shù)的小型機和全部的個人計算機都會使用此碼,可以說是字符編碼中的ISO國際標準。

在ASCII編碼中規(guī)定,用7個比特的二進制作為單字節(jié)的低位,然后再加一個額外擴充的比特占據(jù)高位,形成一個完整的字節(jié),從而表示一個整數(shù)。該編碼規(guī)定,大寫的字母A編碼是65,小寫的字母a編碼是97,后面字母的數(shù)值按順序遞增。

最初在ASCII編碼表中,只有128個字符,包括大小寫英文字母、數(shù)字、標點符號和32個控制字符。后來又新增了128個字符,作為擴展的ASCII碼,所以ASCII編碼中共有256個字符。雖然ASCII編碼中的字符也不少,但該表中關(guān)于字母和數(shù)字的記憶其實是非常簡單的。我們只要記住一個字母或數(shù)字的ASCII碼(如A編碼是65,a編碼是97,0編碼是48),然后記住相應(yīng)的大小寫字母之間相差32,就可以推算出其余字母的ASCII碼。

但由于ASCII字符集中的字符數(shù)目有限,在現(xiàn)在的實際應(yīng)用中是無法滿足要求的,因此后來國際標準化組織制定了一個ISO2025標準。它在保證與ISO646兼容的前提下,ISO陸續(xù)制定了一批適用于不同國家和地區(qū)的擴展ASCII字符集,以滿足實際需求。

2.2GB2312編碼

ACSII編碼主要適用于英語等歐美語言,對于中文是不實用的,中文在ASCII編碼環(huán)境中會以亂碼顯示。但是中文有這么大的使用需求,不可能用西文來存儲和展示信息,我們需要一個針對中文的映射關(guān)系表,所以中國就制定了GB2312編碼,用于存儲和傳輸中文信息。

為了滿足漢字的存儲和傳輸需求,中國國家標準總局發(fā)布了一系列的漢字字符集國家標準編碼,統(tǒng)稱為GB碼,或國標碼。其中最有影響的是于1980年發(fā)布的《信息交換用漢字編碼字符集基本集》,標準號為GB2312-1980。該編碼在中文國家使用非常普遍,包括國內(nèi)和新加坡等地。

GB2312是一個簡體中文字符集,該編碼由6763個常用漢字和682個全角的非漢字字符組成,屬于是ANSI編碼里的一種,而ANSI編碼又是對ASCII編碼的擴充。但是該編碼只包含簡體中文,不包括繁體中文,所以港澳臺地區(qū)并不使用本編碼。

2.3Big5編碼

因為GB2312b不支持繁體字,所以為了支持繁體字,1984年,臺灣五大廠商宏碁、神通、佳佳、零壹以及大眾,共同制定了一種繁體中文編碼方案,所以被稱為五大碼,英文寫作Big5。后來英文翻譯回漢文后,習(xí)慣稱其為大五碼。目前該編碼已經(jīng)成了繁體字的標準碼。

大五碼是支持繁體中文漢字的字符集,包括13053個繁體字、808個標點符號、希臘字母及特殊符號。Big5字符主要包括標點符號、希臘字母及特殊符號、常用漢字、非常用漢字,其余部分保留給其他廠商支持。

2.4Unicode編碼

因為不同國家和地區(qū)使用的語言不同,而ASCII碼只針對英語體系,所以ASCII出現(xiàn)之后的很長一段時間內(nèi),很多主流國家和地區(qū)都搞出了自己的一套或多套編碼。如此以來,就會出現(xiàn)一個問題,各個主流國家都自己的編碼,就不可避免會有沖突,這就阻礙了不同國家和地區(qū)直接的信息交流。

為了解決國際間信息傳輸和交流的障礙,國際標準化組織又搞出了一套Unicode編碼,目標是把所有語言都統(tǒng)一到一套編碼里,這樣不同語言之間就不會產(chǎn)生亂碼問題了。

在Unicode編碼中,一般是用兩個字節(jié)表示一個字符(特別偏僻的字符需要4個字節(jié)),目前現(xiàn)代操作系統(tǒng)和大多數(shù)編程語言都直接支持Unicode編碼。但Unicode編碼比ASCII編碼多占用了近一倍的存儲空間,所以在存儲和傳輸上需要消耗較多的資源。

2.5UTF-8編碼

因為Unicode編碼需要占用較多的存儲空間,所以基于節(jié)約的原則,后來又出現(xiàn)了把Unicode編碼轉(zhuǎn)化為可變長編碼的UTF-8編碼。目前UTF-8編碼,已經(jīng)是軟件開發(fā)時的主流編碼了。所以作為一個程序員,如果你們公司沒有特別地說明,請各位把自己各種開發(fā)工具的編碼都默認設(shè)置成UTF-8編碼!

UTF-8編碼是把一個Unicode字符,根據(jù)不同的數(shù)字大小編碼成1-6個字節(jié)。通俗地說,UTF-8可以根據(jù)不同的符號自動選擇編碼的長短。比如把常用的英文字母編碼成1個字節(jié),漢字通常是3個字節(jié),只有很生僻的字符才會被編碼成4-6個字節(jié)。所以如果我們的程序和信息中要傳輸大量的英文字符,用UTF-8編碼就比較節(jié)省空間了。而且UTF-8編碼的另一個好處是容錯能力強,如果傳輸過程中某些字符出錯,不會影響后續(xù)字符。因為UTF-8編碼依靠高字節(jié)位來確定一個字符究竟是幾個字節(jié),所以現(xiàn)在它經(jīng)常用來作為傳輸編碼。

2.6GBK編碼

雖然之前已經(jīng)有GB2312編碼用于處理簡體中文了,但因為GB2312編碼設(shè)計的時間較早,當(dāng)時很多的漢字并沒有被涵蓋進來。比如對于人名、古漢語中出現(xiàn)的罕用字,就無法滿足使用需求,所以當(dāng)時戶籍系統(tǒng)中有些人的名字比較特殊,就無法用計算機打出來。所以為了滿足更多的使用需求,后來又設(shè)計了GBK編碼。

GBK(ChineseInternalCodeSpecification,漢字內(nèi)碼擴展規(guī)范),K其實是擴的聲母。GBK編碼會兼容GB2312,共收錄了21003個漢字、883個符合,并提供了1894個造字碼位,簡、繁體字融于一庫。目前,GBK編碼已經(jīng)成了中文的標準編碼,比GB2312使用的更為普遍,所以如果我們對中文有特殊使用需求,可以使用GBK。

二.String編碼設(shè)置

1.概述

作為一個程序員,尤其是中國的程序員,我們在進行開發(fā)時,需要有一些特殊的編碼設(shè)置。因為我們知道,我們的各種開發(fā)語言基本上都是基于英語環(huán)境的,但我們在開發(fā)各種中文環(huán)境的軟件項目時,時不時又會有中文信息需要傳輸和展示。如果我們采用ASCII等編碼,信息中包含中文時就可能會出現(xiàn)亂碼,所以我們需要選擇一個合理的編碼,以避免出現(xiàn)中文亂碼問題。

在開發(fā)時,如果公司沒有特殊要求,一般是采用UTF-8編碼。但在個別需要傳輸中文時,比如字符串中就包含一段中文,此時也可以針對這段中文字符串進行單獨的編碼設(shè)置。

2.轉(zhuǎn)換編碼

Java的String和char在內(nèi)存中總是以Unicode編碼來表示的,如果我們想手動把字符串轉(zhuǎn)換成其他編碼,也是可以實現(xiàn)的。那么接下來,就通過一段代碼案例來給大家進行演示,如何對String字符串的編碼進行轉(zhuǎn)換。

publicclassDemo10{

publicstaticvoidmain(String[]args){

try{

//系統(tǒng)默認的編碼是Unicode

byte[]b1="中國".getBytes();

Strings1=newString(b1);

System.out.println("s1="+s1);

//將字符串按UTF-8編碼進行轉(zhuǎn)換

byte[]b2="中國".getBytes("UTF-8");

Strings2=newString(b2);

System.out.println("s2="+s2);

//將字符串按UTF-8編碼進行轉(zhuǎn)換,另一種方式,采用系統(tǒng)自帶常量StandardCharsets來調(diào)用UTF-8編碼

byte[]b3="中國".getBytes(StandardCharsets.UTF_8);

Strings3=newString(b3);

System.out.println("s3="+s3);

//將字符串按GBK編碼進行轉(zhuǎn)換

byte[]b4="你好".getBytes("GBK");

//將字節(jié)數(shù)組解碼,轉(zhuǎn)為新的字符對象,并明確采用的編碼格式

//注意,此處必須明確指明采用哪種編碼,此處采用的編碼格式,要與編碼時的格式一致,否則中文會亂碼。

//Strings4=newString(b4,"UTF-8");

//此處必須是采用GBK

Strings4=newString(b4,"GBK");

System.out.println("s4="+s4);

}catch(UnsupportedEncodingExceptione){

//注意:設(shè)置字符串的編碼時,可能會出現(xiàn)不支持的編碼異常UnsupportedEncodingException。

//關(guān)于異常,以后再給大家細講

e.printStackTrace();

}

Java的String和char類型,在內(nèi)存中默認是采用的Unicode編碼,但我們可以采用新的編碼對原有字符串進行重新編碼,這主要是通過字符串.getBytes(編碼名稱)的方式實現(xiàn)。在轉(zhuǎn)換編碼格式后,原有的字符串或字符,就不再是char類型了,而是byte數(shù)組類型。

但當(dāng)我們采用GBK或GB2312編碼,對原有字符進行編碼得到新的字節(jié)數(shù)組后,如果想得到新的字符或字符串,也需要明確采用相同的GBK或GB2312編碼對byte數(shù)組進行解碼,否則中文會亂碼。

另外我們還要注

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論