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

下載本文檔

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

文檔簡(jiǎn)介

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

一.字符編碼

1.編碼簡(jiǎn)介

對(duì)很多小白來(lái)說(shuō),可能不明白什么是字符編碼,也不知道為什么要有字符編碼,所以就先來(lái)給大家簡(jiǎn)要地介紹一下字符編碼。

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

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

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

2.常用編碼

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

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

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

2.1ASCII編碼

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

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

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

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

2.2GB2312編碼

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

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

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

2.3Big5編碼

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

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

2.4Unicode編碼

因?yàn)椴煌瑖?guó)家和地區(qū)使用的語(yǔ)言不同,而ASCII碼只針對(duì)英語(yǔ)體系,所以ASCII出現(xiàn)之后的很長(zhǎng)一段時(shí)間內(nèi),很多主流國(guó)家和地區(qū)都搞出了自己的一套或多套編碼。如此以來(lái),就會(huì)出現(xiàn)一個(gè)問(wèn)題,各個(gè)主流國(guó)家都自己的編碼,就不可避免會(huì)有沖突,這就阻礙了不同國(guó)家和地區(qū)直接的信息交流。

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

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

2.5UTF-8編碼

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

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

2.6GBK編碼

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

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

二.String編碼設(shè)置

1.概述

作為一個(gè)程序員,尤其是中國(guó)的程序員,我們?cè)谶M(jìn)行開(kāi)發(fā)時(shí),需要有一些特殊的編碼設(shè)置。因?yàn)槲覀冎溃覀兊母鞣N開(kāi)發(fā)語(yǔ)言基本上都是基于英語(yǔ)環(huán)境的,但我們?cè)陂_(kāi)發(fā)各種中文環(huán)境的軟件項(xiàng)目時(shí),時(shí)不時(shí)又會(huì)有中文信息需要傳輸和展示。如果我們采用ASCII等編碼,信息中包含中文時(shí)就可能會(huì)出現(xiàn)亂碼,所以我們需要選擇一個(gè)合理的編碼,以避免出現(xiàn)中文亂碼問(wèn)題。

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

2.轉(zhuǎn)換編碼

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

publicclassDemo10{

publicstaticvoidmain(String[]args){

try{

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

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

Strings1=newString(b1);

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

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

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

Strings2=newString(b2);

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

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

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

Strings3=newString(b3);

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

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

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

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

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

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

//此處必須是采用GBK

Strings4=newString(b4,"GBK");

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

}catch(UnsupportedEncodingExceptione){

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

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

e.printStackTrace();

}

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

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

另外我們還要注

溫馨提示

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

評(píng)論

0/150

提交評(píng)論