logo

Java String Encoding

V Javě, když se zabýváme Tětiva někdy je nutné zakódovat řetězec do určité znakové sady. Kódování je způsob převodu dat z jednoho formátu do druhého. Objekty typu String používají kódování UTF-16. Problém s UTF-16 je, že jej nelze upravit. Existuje pouze jeden způsob, který lze použít k získání jiného kódování, tj. pole byte[]. Způsob kódování není vhodný, pokud získáme neočekávaná data. V této části se naučíme jak zakódovat řetězec Jáva .

Poznámka: Není možné kódovat řetězec v UTF-8. Takže použijte buď ByteBuffer, nebo na něm zavolejte pole, abyste získali byte[].

Než budeme pokračovat v této části, musíme porozumět kódování znaků. Pojďme se rychle podívat. Pojďme si rozumět proč potřebujeme kódovat řetězec .

Kódování znaků je technika převodu textových dat na binární čísla. Specifickým znakům můžeme přiřadit jedinečné číselné hodnoty a tato čísla převést do binárního jazyka. Tato binární čísla lze později převést zpět na původní znaky na základě jejich hodnot.

Problém

Předpokládejme, že máme německý řetězec sbohem a je nutné jej zakódovat. Zvažte následující fragment kódu:

 String str = 'Tsch�ss'; byte[] bytesOfString = str.getBytes(); String encoded_String = new String(bytesOfString, StandardCharsets.US_ASCII); assertNotEquals(encoded_String, str); 

Pokud zakódujeme řetězec pomocí US_ASCII, dostane sbohem protože kódování US_ASCII nerozumí znaku, který není ASCII ( u ). Když převedeme řetězec zakódovaný v ASCII na UTF-8, dostaneme stejný řetězec.

 String str = 'GoodBye'; byte[] bytesOfString = str.getBytes(); String asciiEncondedEnglishString = new String(bytesOfString, StandardCharsets.US_ASCII); assertEquals(encoded_String, str); 

Pokud pole byte[] obsahuje text, který není Unicode, můžeme text převést na Unicode pomocí Tětiva konstruktér. Naopak můžeme také převést objekt String na pole bajtů[] znaků mimo Unicode pomocí String.getBytes() metoda. Pojďme kódovat řetězec pomocí getBytes() metoda.

Použití metody String.getBytes().

Jáva Tětiva třída poskytuje metoda getBytes(). který se používá ke kódování řetězce do UTF-8. Metoda převede řetězec na sekvenci bajtů a výsledek uloží do pole.

Syntax:

 public byte[] getBytes(String charsetName) throws UnsupportedEncodingException 

Analyzuje charsetName jako parametr a vrací bajtové pole. To hází UnsupportedEncodingException pokud pojmenovaná znaková sada není podporována.

Vytvořme Java program, který převede řetězec do kódování UTF-8.

StringEncodingExample.java

 public class StringEncodingExample { public static void main(String args[]) throws Exception { //string to encode String str = 'Google Cloud'; //invokes the getBytes() method and stores an array of bytes into array[] byte array[] = str.getBytes('UTF8'); System.out.println('Encoded String: '); //enhanced for loop that iterates over the array for (byte x: array) { //prints the sequence of bytes System.out.print(x+' '); } } } 

Výstup:

 Encoded String: 71 111 111 103 108 101 32 67 108 111 117 100 

Použití třídy StandardCharsets

Pro zakódování řetězce můžeme také použít třídu StandardCharset. Pro kódování řetězce existují dva kroky. Nejprve dekódujte řetězec na bajty a poté jej zakódujte do UTF-8. Zvažte například následující kód:

 String str = ' Tsch�ss'; ByteBuffer buffer = StandardCharsets.UTF_8.encode(str); String encoded_String = StandardCharsets.UTF_8.decode(buffer).toString(); assertEquals(str, encoded_String); 

Dalším způsobem kódování řetězce je použití kódování Base64. Kódování a dekódování Base64 probereme v nadcházející části.