欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java設(shè)置String字符串編碼方法詳解

 更新時(shí)間:2023年05月11日 09:07:02   作者:一一哥Sun  
因?yàn)镾tring字符串很常用,所以我們?cè)谑褂盟倪^(guò)程中,可能會(huì)面臨各種問(wèn)題,比如”中文亂碼“問(wèn)題等,那么為什么中文會(huì)亂碼?本文將給大家介紹一下Java如何設(shè)置String字符串編碼,來(lái)避免和解決這一常見(jiàn)問(wèn)題,需要的朋友可以參考下

一. 字符編碼

1. 編碼簡(jiǎn)介

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

所謂的字符編碼(Character Encoding),也叫做字集碼,其實(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,而寫(xiě)入到存儲(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)來(lái)說(shuō),計(jì)算機(jī)直接把一堆0101展示在我們面前,我們又不是電路板,怎么可能識(shí)別?!所以這時(shí)候就需要在人類(lèi)可讀的數(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.1 ASCII編碼

ASCII(American Standard Code for Information Interchange,美國(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ī)定,大寫(xiě)的字母A編碼是65,小寫(xiě)的字母a編碼是97,后面字母的數(shù)值按順序遞增。

最初在ASCII編碼表中,只有128個(gè)字符,包括大小寫(xiě)英文字母、數(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)的大小寫(xiě)字母之間相差32,就可以推算出其余字母的ASCII碼。

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

2.2 GB2312編碼

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

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

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

2.3 Big5編碼

因?yàn)镚B2312b不支持繁體字,所以為了支持繁體字,1984年,臺(tái)灣五大廠商宏碁、神通、佳佳、零壹以及大眾,共同制定了一種繁體中文編碼方案,所以被稱(chēng)為”五大碼“,英文寫(xiě)作Big5。后來(lái)英文翻譯回漢文后,習(xí)慣稱(chēng)其為”大五碼“。目前該編碼已經(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.4 Unicode編碼

因?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.5 UTF-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.6 GBK編碼

雖然之前已經(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ú)法滿(mǎn)足使用需求,所以當(dāng)時(shí)戶(hù)籍系統(tǒng)中有些人的名字比較特殊,就無(wú)法用計(jì)算機(jī)打出來(lái)。所以為了滿(mǎn)足更多的使用需求,后來(lái)又設(shè)計(jì)了GBK編碼。

GBK(Chinese Internal Code Specification,漢字內(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)槲覀冎?,我們的各種開(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)換。

public class Demo10 {
    public static void main(String[] args) {
	try {
            // 系統(tǒng)默認(rèn)的編碼是Unicode
            byte[] b1 = "中國(guó)".getBytes(); 
            String s1=new String(b1);
            System.out.println("s1="+s1);
			
            // 將字符串按UTF-8編碼進(jìn)行轉(zhuǎn)換
            byte[] b2 = "中國(guó)".getBytes("UTF-8");
            String s2=new String(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); 
            String s3=new String(b3);
            System.out.println("s3="+s3);
			
            // 將字符串按GBK編碼進(jìn)行轉(zhuǎn)換
            byte[] b4 = "你好".getBytes("GBK");
            //將字節(jié)數(shù)組解碼,轉(zhuǎn)為新的字符對(duì)象,并明確采用的編碼格式
            //注意,此處必須明確指明采用哪種編碼,此處采用的編碼格式,要與編碼時(shí)的格式一致,否則中文會(huì)亂碼。
            //String s4=new String(b4,"UTF-8");
            //此處必須是采用GBK
            String s4=new String(b4,"GBK");
            System.out.println("s4="+s4);
	} catch (UnsupportedEncodingException e) {
            //注意:設(shè)置字符串的編碼時(shí),可能會(huì)出現(xiàn)不支持的編碼異常UnsupportedEncodingException。
            //關(guān)于異常,以后再給大家細(xì)講
            e.printStackTrace();
	} 
    }
}

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

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

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

三. 結(jié)語(yǔ)

至此,就把String字符串的編碼問(wèn)題給大家介紹完畢了,現(xiàn)在你知道該如何處理字符串的編碼了嗎?今天的重點(diǎn)內(nèi)容如下:

  • 了解開(kāi)發(fā)中常用的幾種編碼名稱(chēng),比如ASCII、Unicode、UTF-8、GBK等;
  • 掌握String字符串在不同的編碼之間轉(zhuǎn)換。

以上就是Java設(shè)置String字符串編碼方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Java設(shè)置String字符串編碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 通過(guò)Java修改游戲存檔的實(shí)現(xiàn)思路

    通過(guò)Java修改游戲存檔的實(shí)現(xiàn)思路

    這篇文章主要介紹了通過(guò)Java修改游戲存檔的實(shí)現(xiàn)思路,實(shí)現(xiàn)方法也很簡(jiǎn)單,因?yàn)橹参锎髴?zhàn)僵尸游戲的數(shù)據(jù)文件存儲(chǔ)在本地的存儲(chǔ)位置是已知的,因此我們可以將實(shí)現(xiàn)過(guò)程拆分為三個(gè)步驟,需要的朋友可以參考下
    2021-10-10
  • SpringCloud分布式事務(wù)Seata部署和集成過(guò)程

    SpringCloud分布式事務(wù)Seata部署和集成過(guò)程

    這篇文章主要介紹了SpringCloud分布式事務(wù)Seata部署和集成過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-10-10
  • Java冒泡排序簡(jiǎn)單實(shí)現(xiàn)

    Java冒泡排序簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要介紹了Java冒泡排序簡(jiǎn)單實(shí)現(xiàn),具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Springboot Cucumber測(cè)試配置介紹詳解

    Springboot Cucumber測(cè)試配置介紹詳解

    這篇文章主要介紹了Springboot Cucumber測(cè)試配置介紹詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • SpringAOP中基于注解實(shí)現(xiàn)通用日志打印方法詳解

    SpringAOP中基于注解實(shí)現(xiàn)通用日志打印方法詳解

    這篇文章主要介紹了SpringAOP中基于注解實(shí)現(xiàn)通用日志打印方法詳解,在日常開(kāi)發(fā)中,項(xiàng)目里日志是必不可少的,一般有業(yè)務(wù)日志,數(shù)據(jù)庫(kù)日志,異常日志等,主要用于幫助程序猿后期排查一些生產(chǎn)中的bug,需要的朋友可以參考下
    2023-12-12
  • MyBatis-Plus解決邏輯刪除與唯一索引的問(wèn)題

    MyBatis-Plus解決邏輯刪除與唯一索引的問(wèn)題

    本文主要介紹了MyBatis-Plus解決邏輯刪除與唯一索引的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Java本地緩存實(shí)現(xiàn)代碼示例

    Java本地緩存實(shí)現(xiàn)代碼示例

    這篇文章主要給大家介紹了關(guān)于Java本地緩存實(shí)現(xiàn)的相關(guān)資料,對(duì)于緩存的作用不言而喻,可以提高查詢(xún)效率,比去DB查詢(xún)的速度要快,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-08-08
  • Java基礎(chǔ)教程之類(lèi)型轉(zhuǎn)換與多態(tài)

    Java基礎(chǔ)教程之類(lèi)型轉(zhuǎn)換與多態(tài)

    這篇文章主要介紹了Java基礎(chǔ)教程之類(lèi)型轉(zhuǎn)換與多態(tài),本文講解了 基本類(lèi)型轉(zhuǎn)換、 upcast與多態(tài)、 Object類(lèi)等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Java線(xiàn)程池中的各個(gè)參數(shù)如何合理設(shè)置

    Java線(xiàn)程池中的各個(gè)參數(shù)如何合理設(shè)置

    這篇文章主要介紹了Java線(xiàn)程池中的各個(gè)參數(shù)如何合理設(shè)置操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • MyBatis SpringMVC整合實(shí)現(xiàn)步驟詳解

    MyBatis SpringMVC整合實(shí)現(xiàn)步驟詳解

    這篇文章主要介紹了MyBatis SpringMVC整合實(shí)現(xiàn)步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08

最新評(píng)論