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

Java設置String字符串編碼方法詳解

 更新時間:2023年05月11日 09:07:02   作者:一一哥Sun  
因為String字符串很常用,所以我們在使用它的過程中,可能會面臨各種問題,比如”中文亂碼“問題等,那么為什么中文會亂碼?本文將給大家介紹一下Java如何設置String字符串編碼,來避免和解決這一常見問題,需要的朋友可以參考下

一. 字符編碼

1. 編碼簡介

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

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

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

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

2. 常用編碼

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

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

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

2.1 ASCII編碼

ASCII(American Standard Code for Information Interchange,美國信息交換標準碼),是基于拉丁字母的字符編碼系統(tǒng),主要用于顯示現(xiàn)代英語和其他西歐語言。 它是現(xiàn)今最通用、最經典的單字節(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編碼中的字符也不少,但該表中關于字母和數(shù)字的記憶其實是非常簡單的。我們只要記住一個字母或數(shù)字的ASCII 碼(如A編碼是65,a編碼是97,0編碼是48),然后記住相應的大小寫字母之間相差32,就可以推算出其余字母的ASCII碼。

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

2.2 GB2312編碼

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

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

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

2.3 Big5編碼

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

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

2.4 Unicode編碼

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

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

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

2.5 UTF-8編碼

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

2.6 GBK編碼

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

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

二. String編碼設置

1. 概述

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

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

2. 轉換編碼

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

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

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

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

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

三. 結語

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

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

以上就是Java設置String字符串編碼方法詳解的詳細內容,更多關于Java設置String字符串編碼的資料請關注腳本之家其它相關文章!

相關文章

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

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

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

    SpringCloud分布式事務Seata部署和集成過程

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

    Java冒泡排序簡單實現(xiàn)

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

    Springboot Cucumber測試配置介紹詳解

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

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

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

    MyBatis-Plus解決邏輯刪除與唯一索引的問題

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

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

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

    Java基礎教程之類型轉換與多態(tài)

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

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

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

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

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

最新評論