91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-07 09:03:26 來源:腳本之家 閱讀:280 作者:Nuub 欄目:編程語言

為什么寫這個

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

String類型的編碼方式

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

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

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

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

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

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

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

下面來看一下運行結果:

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

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

String.getBytes()方法

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

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

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

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

ByteBuffer與byte數組的互相轉換

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

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

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

So

綜上所述,再在這里總結一下:

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

小總結

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嘉峪关市| 正镶白旗| SHOW| 海南省| 淳化县| 余姚市| 阿拉善盟| 澄迈县| 凯里市| 车致| 临海市| 崇州市| 兰州市| 东乡县| 临邑县| 仁化县| 桂东县| 柳州市| 广州市| 横山县| 区。| 清涧县| 凤翔县| 晋宁县| 田东县| 太湖县| 三河市| 漾濞| 瓮安县| 响水县| 山东| 湘乡市| 砀山县| 嘉善县| 达孜县| 高青县| 称多县| 福州市| 淮阳县| 水城县| 彰化市|