最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java中String類型與默認字符編碼

 更新時間:2019年05月05日 12:01:49   作者:Nuub  
這篇文章主要介紹了Java中String類型與默認字符編碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

為什么寫這個

至于為什么要寫這個,主要是一句mmp一定要講,繞了一上午,暈死
Java程序中的中文亂碼問題一直是一個困擾程序員的難題,自己也不例外,早在做項目時就遇到過很多編碼方式的坑,當時想填來著,但是嫌麻煩。這次終于忍不住了,一定要弄個明白

String類型的編碼方式

從網(wǎng)上查的資料都說,Java默認的字符編碼是Unicode,而String類型的編碼方式是與JVM編碼方式和本機操作系統(tǒng)默認字符集有關的。于是我做出了測試
在Java中可以這樣顯示查看本地編碼方式(JVM還是OS呢?)

// Gets the system property indicated by the specified key.
System.out.println(System.getProperty(file.encoding));

看注釋上說是獲取系統(tǒng)字符集,但是我對這個系統(tǒng)的概念表示存疑,為什么呢,因為眾所周知,我們中國人的電腦大部分默認的字符編碼方式就是GBK,在CMD中輸入chcp可以獲得一個數(shù)值936,這就表示了是GBK的編碼方式。

但是我自己運行出這句話的結(jié)果竟然是UTF-8,我是在IDEA中運行的,并且已經(jīng)使用IDEA設置了項目的編碼方式是UTF-8,出現(xiàn)這樣的結(jié)果我只能是猜測其實上面這句話是獲取JVM(跟隨項目的編碼方式)的編碼方式

接下來我們來回歸正題,String類型的默認編碼方式是什么,有下面這幾句語句:

/* 測試String類型默認的編碼方式
*/

// 使用String的有參構(gòu)造方法
String str = new String("hhhh ty智障%shfu摸淑芬十分uif內(nèi)服NSF黑");
// 1.以GBK編碼方式獲取str的字節(jié)數(shù)組,再用String有參構(gòu)造函數(shù)構(gòu)造字符串
System.out.println(new String(str.getBytes("GBK")));
// 2.以UTF-8編碼方式獲取str的字節(jié)數(shù)組,再以默認編碼構(gòu)造字符串
System.out.println(new String(str.getBytes("UTF-8")));

下面來看一下運行結(jié)果:

// 1.
hhhh ty����%shfu�����ʮ��uif�ڷ�NSF��i����ظ���u��Ϊ��ؼu ��δ���δ��� hhhh ty智障%shfu摸淑芬十分uif內(nèi)服NSF黑i飛鳥回復額u發(fā)為呢丶u 房未婚夫未婚夫
// 2.
hhhh ty智障%shfu摸淑芬十分uif內(nèi)服NSF黑i飛鳥回復額u發(fā)為呢丶u 房未婚夫未婚夫

 可以很明顯的可以看出,這里String類型默認的字符編碼方式就是與我們查看本地系統(tǒng)的編碼方式相同。因此我們得出結(jié)論:String類型的默認編碼方式是和本地編碼方式相關

String.getBytes()方法

我們大多數(shù)情況下是不使用String類型的,而是使用byte數(shù)組來傳輸操作數(shù)據(jù),一般會使用String.getBytes()方法來將字符串轉(zhuǎn)換成字節(jié)數(shù)組。但是這樣轉(zhuǎn)換的時候,會不會牽涉到編碼問題呢?仔細查看了String.getBytes()的源碼,分為無參的和有參的兩種:

// 1.無參的getBytes()方法
  public byte[] getBytes() {
    // 再繼續(xù)深入encode()方法可以發(fā)現(xiàn)使用的是系統(tǒng)默認的字符編碼
    return StringCoding.encode(value, 0, value.length);
  }

// 2.帶參數(shù)的getBytes(String charsetName)方法
  public byte[] getBytes(String charsetName)
      throws UnsupportedEncodingException {
    if (charsetName == null) throw new NullPointerException();
    // 繼續(xù)深入可以發(fā)現(xiàn),會使用參數(shù)字符集編碼方式來返回字節(jié)數(shù)組,如果參數(shù)字符集不存在,則使用本地系統(tǒng)默認的字符編碼
    return StringCoding.encode(charsetName, value, 0, value.length);
  }

綜上,在這里再強調(diào)一下,因為修改了項目的編碼方式,導致了本地系統(tǒng)的編碼方式也變成了UTF-8,所以上述的實驗都是基于IDE修改了工程項目編碼方式的基礎上

ByteBuffer與byte數(shù)組的互相轉(zhuǎn)換

在NIO中,一般都是使用ByteBuffer來當作字符緩沖,而有的時候我們只有byte[]數(shù)組,所以是需要它們之間進行相互轉(zhuǎn)換的

// ByteBuffer ----> byte[]
byte[] bytes = ByteBuffer.array();

// byte[] ------> ByteBuffer
byte[] bytes = new byte[1024];
ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);

So

綜上所述,再在這里總結(jié)一下:

  1. 本地JVM的編碼方式是和本機OS默認的字符編碼方式相關的,但是JVM的編碼方式可以被修改
  2. Java程序的默認字符集是Unicode,在程序中聲明的String類型的編碼方式是和JVM編碼方式相關的
  3. String.getBytes()方法默認的編碼方式是JVM編碼方式;同時還可以接收一個字符集名稱當作參數(shù),優(yōu)先使用參數(shù)的字符集
  4. 因為Java代碼使用的Unicode字符集,允許各編碼方式之間轉(zhuǎn)換,但不保證bit損失,所以String類型可以得到不同編碼方式的byte數(shù)組,只要按照編碼解碼的方式獲取字符串類型顯示即可
  5. 文件的流通道是根據(jù)文件的編碼方式?jīng)Q定的,所以不同編碼方式的文件讀寫時要注意編碼解碼
  6. ByteBuffer聲明的buffer可以與byte數(shù)組之間進行轉(zhuǎn)換,但要注意的是ByteBuffer的大小一定要足夠大以承載下所有的byte數(shù)組

小總結(jié)

搞清楚了這些甚是豁然開朗,其實很多時候中文的亂碼問題根源就是編碼方式與解碼方式不一致,或者是不同編碼方式之間轉(zhuǎn)換時造成了bit損失。所以我們還是要注意規(guī)范化編碼與解碼方式,畢竟有的轉(zhuǎn)換操作是不可逆的。

以上所述是小編給大家介紹的Java中String類型與默認字符編碼詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • apache ant進行zip解壓縮操作示例分享

    apache ant進行zip解壓縮操作示例分享

    本文主要介紹了使用apache ant進行zip解壓縮操作的方法,可以解決中文編碼和首層父類無法創(chuàng)建問題,需要的朋友可以參考下
    2014-02-02
  • SpringBoot實現(xiàn)自定義Redis的連接的流程步驟

    SpringBoot實現(xiàn)自定義Redis的連接的流程步驟

    Spring Boot 自定義 Redis 主要是指在基于 Spring Boot 的應用程序中,當你需要更深入地控制或擴展對 Redis 數(shù)據(jù)庫的操作,而不是僅僅依賴 Spring Data Redis 的默認配置,本文給大家介紹了SpringBoot實現(xiàn)自定義Redis的連接的流程步驟,需要的朋友可以參考下
    2024-09-09
  • Java實現(xiàn)Http請求的常用方法詳解

    Java實現(xiàn)Http請求的常用方法詳解

    在實際開發(fā)過程中,我們經(jīng)常需要調(diào)用對方提供的接口或測試自己寫的接口是否合適,本文為大家整理了Java調(diào)用第三方http接口幾種方式,需要的可以參考下
    2025-02-02
  • 關于MyBatis plus條件構(gòu)造器的逐條詳解

    關于MyBatis plus條件構(gòu)造器的逐條詳解

    什么是條件構(gòu)造器呢?簡單來說,條件構(gòu)造器就是用來生成我們查數(shù)據(jù)庫的sql。它可以簡化sql代碼的編寫,靈活、方便且易于維護
    2021-09-09
  • 淺談java 字符串,字符數(shù)組,list間的轉(zhuǎn)化

    淺談java 字符串,字符數(shù)組,list間的轉(zhuǎn)化

    下面小編就為大家?guī)硪黄獪\談java 字符串,字符數(shù)組,list間的轉(zhuǎn)化。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Spring中ApplicationEvent事件機制源碼詳解

    Spring中ApplicationEvent事件機制源碼詳解

    這篇文章主要介紹了Spring中ApplicationEvent事件機制源碼詳解,Spring中與事件有關的接口和類主要包括ApplicationEvent、ApplicationListener,下面來看一下Spring中事件的具體應用,需要的朋友可以參考下
    2023-09-09
  • Springboot 使用 JSR 303 對 Controller 控制層校驗及 Service 服務層 AOP 校驗 使用消息資源文件對消息國際化

    Springboot 使用 JSR 303 對 Controller 控制層校驗及 Service 服務層 AOP 校驗

    這篇文章主要介紹了Springboot 使用 JSR 303 對 Controller 控制層校驗及 Service 服務層 AOP 校驗 使用消息資源文件對消息國際化的相關知識,需要的朋友可以參考下
    2017-12-12
  • MyBatis與其使用方法示例詳解

    MyBatis與其使用方法示例詳解

    MyBatis是一個支持自定義SQL的持久層框架,通過XML文件實現(xiàn)SQL配置和數(shù)據(jù)映射,簡化了JDBC代碼的編寫,本文給大家介紹MyBatis與其使用方法講解,感興趣的朋友一起看看吧
    2025-03-03
  • JAVA序列化和反序列化的底層實現(xiàn)原理解析

    JAVA序列化和反序列化的底層實現(xiàn)原理解析

    這篇文章主要介紹了JAVA序列化和反序列化的底層實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • java中Hashmap的get方法使用

    java中Hashmap的get方法使用

    這篇文章主要介紹了java中Hashmap的get方法使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論

襄垣县| 伊吾县| 长沙市| 喀什市| 河北省| 甘肃省| 上思县| 灯塔市| 越西县| 浑源县| 同仁县| 饶河县| 开远市| 张北县| 崇仁县| 银川市| 漾濞| 清流县| 南溪县| 黔南| 宁德市| 攀枝花市| 沁源县| 安图县| 邵武市| 新丰县| 湘潭县| 项城市| 宁河县| 白银市| 鄂伦春自治旗| 密山市| 广平县| 慈利县| 梧州市| 集安市| 怀远县| 时尚| 繁昌县| 喜德县| 兴国县|