Java字符串編碼知識點詳解介紹

在 Java 中,當我們處理String時,有時需要將字符串編碼為特定字符集。編碼是一種將數據從一種格式轉換為另一種格式的方法。字符串對象使用 UTF-16 編碼。UTF-16 的問題在於它不能被修改。隻有一種方法可以用來獲得不同的編碼,即 byte[] 數組。如果我們得到意外的數據,編碼的方式是不合適的。在本節中,我們將學習如何在Java中對字符串進行編碼。

在繼續本節之前,我們必須瞭解字符編碼。讓我們快速瀏覽一下。讓我們瞭解為什麼我們需要對字符串進行編碼。

字符編碼是一種將文本數據轉換為二進制數的技術。我們可以為特定字符分配唯一的數值,並將這些數字轉換為二進制語言。這些二進制數稍後可以根據它們的值轉換回原始字符。

問題

假設我們有德語字符串Tschüss,需要對其進行編碼。考慮以下代碼片段:

字符串 str =  "Tschüss" ;   
字節[] bytesOfString = str.getBytes();   
String encoded_String =  new  String(bytesOfString, StandardCharsets.US_ASCII); assertNotEquals(encoded_String, str);  

如果我們使用 US_ASCII 對字符串進行編碼,它會給出Tsch?ss,因為 US_ASCII 編碼不理解非 ASCII 字符 ( ü )。當我們將 ASCII 編碼的字符串轉換為 UTF-8 時,我們得到相同的字符串。

字符串 str =  "再見" ;   
字節[] bytesOfString = str.getBytes();   
String asciiEncondedEnglishString =  new  String(bytesOfString, StandardCharsets.US_ASCII);   
assertEquals(encoded_String, str);  

如果 byte[] 數組包含非 Unicode 文本,我們可以使用String構造函數將文本轉換為 Unicode。相反,我們也可以使用String.getBytes()方法將 String 對象轉換為非 Unicode 字符的 byte[] 數組。讓我們使用getBytes()方法對字符串進行編碼。

使用 String.getBytes() 方法

Java String類提供瞭getBytes() 方法,用於將字符串編碼為 UTF-8。該方法將字符串轉換為字節序列並將結果存儲到數組中。

句法:

公共字節[] getBytes(String charsetName) 拋出 UnsupportedEncodingException   

它將 charsetName 解析為參數並返回字節數組。如果不支持命名字符集,它會拋出UnsupportedEncodingException 。

讓我們創建一個將字符串轉換為 UTF-8 編碼的 Java 程序。

StringEncodingExample.java

公共類 StringEncodingExample    
{  
公共靜態void  main(String args[]) 拋出 異常    
{  
//要編碼的字符串      
字符串 str =  "谷歌雲" ;  
//調用getBytes()方法並將一個字節數組存入array[]  
字節 數組[] = str.getBytes( "UTF8" );  
System.out.println( "編碼字符串:" );  
//增強的循環遍歷數組  
對於 (字節 x:數組)   
{  
//打印字節序列      
System.out.print(x+ " " );  
}  
}  
}  

輸出:

編碼字符串:
71 111 111 103 108 101 32 67 108 111 117 100

使用 StandardCharsets 類

我們還可以使用 StandardCharset 類對字符串進行編碼。對字符串進行編碼有兩個步驟。首先,將字符串解碼為字節,然後將其編碼為 UTF-8。例如,考慮以下代碼:

字符串 str =  "Tschüss" ;   
ByteBuffer 緩沖區 = StandardCharsets.UTF_8.encode(str);   
String encoded_String = StandardCharsets.UTF_8.decode(buffer).toString(); assertEquals(str, encoded_String);  

知識點擴展:

為什麼要編碼

不知道大傢有沒有想過一個問題,那就是為什麼要編碼?我們能不能不編碼?要回答這個問題必須要回到計算機是如何表示我們人類能夠理解的符號的,這些符號也就是我們人類使用的語言。由於人類的語言有太多,因而表示這些語言的符號太多,無法用計算機中一個基本的存儲單元—— byte 來表示,因而必須要經過拆分或一些翻譯工作,才能讓計算機能理解。我們可以把計算機能夠理解的語言假定為英語,其它語言要能夠在計算機中使用必須經過一次翻譯,把它翻譯成英語。這個翻譯的過程就是編碼。所以可以想象隻要不是說英語的國傢要能夠使用計算機就必須要經過編碼。這看起來有些霸道,但是這就是現狀,這也和我們國傢現在在大力推廣漢語一樣,希望其它國傢都會說漢語,以後其它的語言都翻譯成漢語,我們可以把計算機中存儲信息的最小單位改成漢字,這樣我們就不存在編碼問題瞭。

所以總的來說,編碼的原因可以總結為:

  • 計算機中存儲信息的最小單元是一個字節即 8 個 bit,所以能表示的字符范圍是 0~255 個
  • 人類要表示的符號太多,無法用一個字節來完全表示,要解決這個矛盾必須需要一個新的數據結構 char,從 char 到 byte 必須編碼

到此這篇關於Java字符串編碼知識點詳解介紹的文章就介紹到這瞭,更多相關Java字符串編碼的介紹內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: