更新時間:2022-11-01 10:14:46 來源:動力節(jié)點 瀏覽1558次
在 Java 中,當我們處理String時,有時需要將字符串編碼為特定字符集。編碼是一種將數(shù)據從一種格式轉換為另一種格式的方法。字符串對象使用 UTF-16 編碼。UTF-16 的問題在于它不能被修改。只有一種方法可以用來獲得不同的編碼,即 byte[] 數(shù)組。如果我們得到意外的數(shù)據,編碼的方式是不合適的。在本節(jié)中,我們將學習如何在Java中對字符串進行編碼。
在繼續(xù)本節(jié)之前,我們必須了解字符編碼。讓我們快速瀏覽一下。讓我們了解為什么我們需要對字符串進行編碼。
字符編碼是一種將文本數(shù)據轉換為二進制數(shù)的技術。我們可以為特定字符分配唯一的數(shù)值,并將這些數(shù)字轉換為二進制語言。這些二進制數(shù)稍后可以根據它們的值轉換回原始字符。
假設我們有德語字符串Tschüss,需要對其進行編碼??紤]以下代碼片段:
字符串 str = "Tschüss" ;
字節(jié)[] 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 = "再見" ;
字節(jié)[] bytesOfString = str.getBytes();
String asciiEncondedEnglishString = new String(bytesOfString, StandardCharsets.US_ASCII);
assertEquals(encoded_String, str);
如果 byte[] 數(shù)組包含非 Unicode 文本,我們可以使用String構造函數(shù)將文本轉換為 Unicode。相反,我們也可以使用String.getBytes()方法將 String 對象轉換為非 Unicode 字符的 byte[] 數(shù)組。讓我們使用getBytes()方法對字符串進行編碼。
Java String類提供了getBytes() 方法,用于將字符串編碼為 UTF-8。該方法將字符串轉換為字節(jié)序列并將結果存儲到數(shù)組中。
句法:
公共字節(jié)[] getBytes(String charsetName) 拋出 UnsupportedEncodingException
它將 charsetName 解析為參數(shù)并返回字節(jié)數(shù)組。如果不支持命名字符集,它會拋出UnsupportedEncodingException 。
讓我們創(chuàng)建一個將字符串轉換為 UTF-8 編碼的 Java 程序。
StringEncodingExample.java
公共類 StringEncodingExample
{
公共靜態(tài)void main(String args[]) 拋出 異常
{
//要編碼的字符串
字符串 str = "谷歌云" ;
//調用getBytes()方法并將一個字節(jié)數(shù)組存入array[]
字節(jié) 數(shù)組[] = str.getBytes( "UTF8" );
System.out.println( "編碼字符串:" );
//增強的循環(huán)遍歷數(shù)組
對于 (字節(jié) x:數(shù)組)
{
//打印字節(jié)序列
System.out.print(x+ " " );
}
}
}
輸出:
編碼字符串:
71 111 111 103 108 101 32 67 108 111 117 100
我們還可以使用 StandardCharset 類對字符串進行編碼。對字符串進行編碼有兩個步驟。首先,將字符串解碼為字節(jié),然后將其編碼為 UTF-8。例如,考慮以下代碼:
字符串 str = "Tschüss" ;
ByteBuffer 緩沖區(qū) = StandardCharsets.UTF_8.encode(str);
String encoded_String = StandardCharsets.UTF_8.decode(buffer).toString(); assertEquals(str, encoded_String);