




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第Java設置String字符串編碼方法詳解目錄一.字符編碼1.編碼簡介2.常用編碼2.1ASCII編碼2.2GB2312編碼2.3Big5編碼2.4Unicode編碼2.5UTF-8編碼2.6GBK編碼二.String編碼設置1.概述2.轉換編碼三.結語
一.字符編碼
1.編碼簡介
對很多小白來說,可能不明白什么是字符編碼,也不知道為什么要有字符編碼,所以就先來給大家簡要地介紹一下字符編碼。
所謂的字符編碼(CharacterEncoding),也叫做字集碼,其實就是一種映射規則,計算機可以根據這個映射規則,將某個字符映射成其他形式的數據,以便在計算機和網絡中進行存儲和傳輸。
例如經典的ASCII字符編碼,就是將字母、數字和其它符號進行編號,并用7個比特的二進制作為單字節的低位,然后再加一個額外擴充的比特占據高位,形成一個完整的字節,從而表示一個整數。在這個編碼規則下,字母A的編號是65(ASCII碼),用單字節表示就是0x41,而寫入到存儲設備時就是二進制的01000001。這樣,A、65、0x41、01000001這四個數據之間就有了對應的映射關系。
有些同學就問了,怎么這么麻煩?直接把A存儲在計算機中不行嗎?這個肯定不行??!之前跟大家講解計算機基礎知識時就說過,計算機的底層硬件只能識別電路信號,即開和關,轉換成數字就是1和0,這就是二進制的由來。也就是說,計算機底層硬件只能識別0和1這兩個數字,你給我存儲A這個字符,肯定就不行咯。但是對我們人類來說,計算機直接把一堆0101展示在我們面前,我們又不是電路板,怎么可能識別?!所以這時候就需要在人類可讀的數據,與計算機底層能夠理解的數據之間有一種映射規則和關系,這種映射規則其實就是字符編碼!
2.常用編碼
現在我們已經知道了字符編碼的概念及其由來,有些同學又問了,都有哪些字符編碼呢?接下來再跟大家聊幾個常用的字符編碼:
ASCII編碼GB2312編碼Big5編碼Unicode編碼UTF-8編碼GBK編碼
當然,在實際的開發中,其實有很多種字符編碼,以上這幾個只是比較常用的字符編碼。
2.1ASCII編碼
ASCII(AmericanStandardCodeforInformationInterchange,美國信息交換標準碼),是基于拉丁字母的字符編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用、最經典的單字節編碼系統,大多數的小型機和全部的個人計算機都會使用此碼,可以說是字符編碼中的ISO國際標準。
在ASCII編碼中規定,用7個比特的二進制作為單字節的低位,然后再加一個額外擴充的比特占據高位,形成一個完整的字節,從而表示一個整數。該編碼規定,大寫的字母A編碼是65,小寫的字母a編碼是97,后面字母的數值按順序遞增。
最初在ASCII編碼表中,只有128個字符,包括大小寫英文字母、數字、標點符號和32個控制字符。后來又新增了128個字符,作為擴展的ASCII碼,所以ASCII編碼中共有256個字符。雖然ASCII編碼中的字符也不少,但該表中關于字母和數字的記憶其實是非常簡單的。我們只要記住一個字母或數字的ASCII碼(如A編碼是65,a編碼是97,0編碼是48),然后記住相應的大小寫字母之間相差32,就可以推算出其余字母的ASCII碼。
但由于ASCII字符集中的字符數目有限,在現在的實際應用中是無法滿足要求的,因此后來國際標準化組織制定了一個ISO2025標準。它在保證與ISO646兼容的前提下,ISO陸續制定了一批適用于不同國家和地區的擴展ASCII字符集,以滿足實際需求。
2.2GB2312編碼
ACSII編碼主要適用于英語等歐美語言,對于中文是不實用的,中文在ASCII編碼環境中會以亂碼顯示。但是中文有這么大的使用需求,不可能用西文來存儲和展示信息,我們需要一個針對中文的映射關系表,所以中國就制定了GB2312編碼,用于存儲和傳輸中文信息。
為了滿足漢字的存儲和傳輸需求,中國國家標準總局發布了一系列的漢字字符集國家標準編碼,統稱為GB碼,或國標碼。其中最有影響的是于1980年發布的《信息交換用漢字編碼字符集基本集》,標準號為GB2312-1980。該編碼在中文國家使用非常普遍,包括國內和新加坡等地。
GB2312是一個簡體中文字符集,該編碼由6763個常用漢字和682個全角的非漢字字符組成,屬于是ANSI編碼里的一種,而ANSI編碼又是對ASCII編碼的擴充。但是該編碼只包含簡體中文,不包括繁體中文,所以港澳臺地區并不使用本編碼。
2.3Big5編碼
因為GB2312b不支持繁體字,所以為了支持繁體字,1984年,臺灣五大廠商宏碁、神通、佳佳、零壹以及大眾,共同制定了一種繁體中文編碼方案,所以被稱為五大碼,英文寫作Big5。后來英文翻譯回漢文后,習慣稱其為大五碼。目前該編碼已經成了繁體字的標準碼。
大五碼是支持繁體中文漢字的字符集,包括13053個繁體字、808個標點符號、希臘字母及特殊符號。Big5字符主要包括標點符號、希臘字母及特殊符號、常用漢字、非常用漢字,其余部分保留給其他廠商支持。
2.4Unicode編碼
因為不同國家和地區使用的語言不同,而ASCII碼只針對英語體系,所以ASCII出現之后的很長一段時間內,很多主流國家和地區都搞出了自己的一套或多套編碼。如此以來,就會出現一個問題,各個主流國家都自己的編碼,就不可避免會有沖突,這就阻礙了不同國家和地區直接的信息交流。
為了解決國際間信息傳輸和交流的障礙,國際標準化組織又搞出了一套Unicode編碼,目標是把所有語言都統一到一套編碼里,這樣不同語言之間就不會產生亂碼問題了。
在Unicode編碼中,一般是用兩個字節表示一個字符(特別偏僻的字符需要4個字節),目前現代操作系統和大多數編程語言都直接支持Unicode編碼。但Unicode編碼比ASCII編碼多占用了近一倍的存儲空間,所以在存儲和傳輸上需要消耗較多的資源。
2.5UTF-8編碼
因為Unicode編碼需要占用較多的存儲空間,所以基于節約的原則,后來又出現了把Unicode編碼轉化為可變長編碼的UTF-8編碼。目前UTF-8編碼,已經是軟件開發時的主流編碼了。所以作為一個程序員,如果你們公司沒有特別地說明,請各位把自己各種開發工具的編碼都默認設置成UTF-8編碼!
UTF-8編碼是把一個Unicode字符,根據不同的數字大小編碼成1-6個字節。通俗地說,UTF-8可以根據不同的符號自動選擇編碼的長短。比如把常用的英文字母編碼成1個字節,漢字通常是3個字節,只有很生僻的字符才會被編碼成4-6個字節。所以如果我們的程序和信息中要傳輸大量的英文字符,用UTF-8編碼就比較節省空間了。而且UTF-8編碼的另一個好處是容錯能力強,如果傳輸過程中某些字符出錯,不會影響后續字符。因為UTF-8編碼依靠高字節位來確定一個字符究竟是幾個字節,所以現在它經常用來作為傳輸編碼。
2.6GBK編碼
雖然之前已經有GB2312編碼用于處理簡體中文了,但因為GB2312編碼設計的時間較早,當時很多的漢字并沒有被涵蓋進來。比如對于人名、古漢語中出現的罕用字,就無法滿足使用需求,所以當時戶籍系統中有些人的名字比較特殊,就無法用計算機打出來。所以為了滿足更多的使用需求,后來又設計了GBK編碼。
GBK(ChineseInternalCodeSpecification,漢字內碼擴展規范),K其實是擴的聲母。GBK編碼會兼容GB2312,共收錄了21003個漢字、883個符合,并提供了1894個造字碼位,簡、繁體字融于一庫。目前,GBK編碼已經成了中文的標準編碼,比GB2312使用的更為普遍,所以如果我們對中文有特殊使用需求,可以使用GBK。
二.String編碼設置
1.概述
作為一個程序員,尤其是中國的程序員,我們在進行開發時,需要有一些特殊的編碼設置。因為我們知道,我們的各種開發語言基本上都是基于英語環境的,但我們在開發各種中文環境的軟件項目時,時不時又會有中文信息需要傳輸和展示。如果我們采用ASCII等編碼,信息中包含中文時就可能會出現亂碼,所以我們需要選擇一個合理的編碼,以避免出現中文亂碼問題。
在開發時,如果公司沒有特殊要求,一般是采用UTF-8編碼。但在個別需要傳輸中文時,比如字符串中就包含一段中文,此時也可以針對這段中文字符串進行單獨的編碼設置。
2.轉換編碼
Java的String和char在內存中總是以Unicode編碼來表示的,如果我們想手動把字符串轉換成其他編碼,也是可以實現的。那么接下來,就通過一段代碼案例來給大家進行演示,如何對String字符串的編碼進行轉換。
publicclassDemo10{
publicstaticvoidmain(String[]args){
try{
//系統默認的編碼是Unicode
byte[]b1="中國".getBytes();
Strings1=newString(b1);
System.out.println("s1="+s1);
//將字符串按UTF-8編碼進行轉換
byte[]b2="中國".getBytes("UTF-8");
Strings2=newString(b2);
System.out.println("s2="+s2);
//將字符串按UTF-8編碼進行轉換,另一種方式,采用系統自帶常量StandardCharsets來調用UTF-8編碼
byte[]b3="中國".getBytes(StandardCharsets.UTF_8);
Strings3=newString(b3);
System.out.println("s3="+s3);
//將字符串按GBK編碼進行轉換
byte[]b4="你好".getBytes("GBK");
//將字節數組解碼,轉為新的字符對象,并明確采用的編碼格式
//注意,此處必須明確指明采用哪種編碼,此處采用的編碼格式,要與編碼時的格式一致,否則中文會亂碼。
//Strings4=newString(b4,"UTF-8");
//此處必須是采用GBK
Strings4=newString(b4,"GBK");
System.out.println("s4="+s4);
}catch(UnsupportedEncodingExceptione){
//注意:設置字符串的編碼時,可能會出現不支持的編碼異常UnsupportedEncodingException。
//關于異常,以后再給大家細講
e.printStackTrace();
}
Java的String和char類型,在內存中默認是采用的Unicode編碼,但我們可以采用新的編碼對原有字符串進行重新編碼,這主要是通過字符串.getBytes(編碼名稱)的方式實現。在轉換編碼格式后,原有的字符串或字符,就不再是char類型了,而是byte數組類型。
但當我們采用GBK或GB2312編碼,對原有字符進行編碼得到新的字節數組后,如果想得到新的字符或字符串,也需要明確采用相同的GBK或GB2312編碼對byte數組進行解碼,否則中文會亂碼。
另外我們還要注
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 交評合同范例
- 買賣酒店合同范例
- 供貨付款合同范例
- 公寓托管維修合同范例
- pvc地板膠合同范例
- 二手房定金合同范例
- 個人設計合同范例6
- 個人分期買車合同范例
- 公寓工程裝修合同范例
- 充值返現合同范例
- 任務一淘米(教學課件)一年級下冊勞動技術(人美版)
- 門頭承包合同協議書范本
- 頂管機租憑合同協議
- 中招美育考試試題及答案
- 2025年湖南中考英命題分析及復習備考策略指導課件
- 湖北省武漢市2025屆高中畢業生四月調研考試語文試卷及答案(武漢四調)
- 4.1.2-元素周期表-課件 高一上學期化學人教版(2019)必修第一冊
- 中華人民共和國能源法
- 銀行間債券市場非金融企業債務融資工具持有人會議規程
- JJF 1175-2007 試驗篩校準規范
- GB∕T 41010-2021 生物降解塑料與制品降解性能及標識要求
評論
0/150
提交評論