Proces pretvaranja niza bajtova u niz naziva se dekodiranje. Ovaj proces zahtijeva Charset. Ipak, trebali bismo koristiti skup znakova za dekodiranje niz bajtova.
Postoje dva načina za pretvaranje niza bajtova u niz:
- Pomoću Konstruktor klase nizova
- Pomoću UTF-8 kodiranje
Korištenjem String Class Constructor
Najjednostavniji način za pretvaranje niza bajtova u String, možemo koristiti konstruktor klase String s byte[] kao argumentom konstruktora.
String str=new String(bytes);
Primjer
Sljedeći primjer ne koristi nikakvo kodiranje znakova.
public class ByteArraytoStringExample { public static void main(String args[]) { try { byte[] bytes = 'hello world'.getBytes(); //creates a string from the byte array without specifying character encoding String s = new String(bytes); System.out.println(s); } catch(Exception e) { e.printStackTrace(); } } }
Izlaz:
Korištenjem UTF-8 kodiranja
Zapamtite kodiranje znakova dok pretvarate niz bajtova u String. Budući da su bajtovi binarni podaci dok su nizovi znakovni podaci. Važno je znati izvorno kodiranje teksta iz kojeg je stvoren niz bajtova. Kada koristimo drugačije kodiranje znakova, ne vraćamo originalni niz.
Pretpostavimo da moramo pročitati niz bajtova iz datoteke koja je kodirana u ' ISO_8859_1 '. Nemamo nikakvo kodiranje znakova dok pretvaramo niz bajtova u niz. Niz bajtova pretvaramo u String pomoću konstruktora klase String, ali on ne daje jamstvo da ćemo dobiti isti tekst natrag. To je zato što konstruktor klase String koristi zadano kodiranje platforme.
Bajtovi sadrže 8 bitova koji mogu imati do 256 različitih vrijednosti. Radi za ASCII skup znakova, gdje se koristi samo sedam bitova. Ako skupovi znakova imaju više od 256 vrijednosti, trebali bismo eksplicitno navesti kodiranje koje govori kako kodirati znakove u niz bajtova.
Postoje sljedeći skupovi znakova koje podržava Java platforma:
- Standardni skupovi znakova.ISO_8859_1
- Standardni skupovi znakova.US_ASCII
- Standardni skupovi znakova.UTF_16
- Standardni skupovi znakova.UTF_16BE
- Standardni skupovi znakova.UTF_16LE
Kada se ne sjećamo točnog kodiranja, u takvim slučajevima naša platforma ne može pravilno pretvoriti te posebne znakove. Ovaj problem je riješen pružanjem ' UTF-8 ' kao kodiranje znakova. Java nudi još jedan preopterećeni konstruktor u klasi String koji prihvaća kodiranje znakova.
new String(byte[], 'character encoding');
Primjer
U sljedećem primjeru koristili smo Standardni skup znakova.UTF_8 za navođenje kodiranja.
import java.io.IOException; import java.nio.charset.StandardCharsets; public class ByteArraytoStringExample1 { public static void main(String[] args) { try { byte[] b = 'Morning'.getBytes(StandardCharsets.UTF_8); //byte array String string = new String(b, StandardCharsets.UTF_8); //string with 'UTF-8' encoding System.out.println(string); } catch(Exception e) { e.printStackTrace(); } } }
Izlaz:
Primjer
U sljedećem primjeru, uzeli smo char dok smo stvarali niz bajtova. Radi zbog autoboxinga. Znak 'T' se pretvara u 84 u nizu bajtova i tako dalje. Zato je izlaz oba niza bajtova isti.
public class ByteArraytoStringExample2 { public static void main(String[] args) { byte[] byteArray = { 'T', 'E', 'C', 'H', 'N', 'O','L','O','G','Y'}; //byte array of characters byte[] byteArray1 = { 84, 69, 67, 72, 78, 79, 76, 79, 71, 89}; //array of ASCII values String s = new String(byteArray); //converts byteArray to String String str = new String(byteArray1); System.out.println(s); System.out.println(str); } }
Izlaz:
Klasa String također ima konstruktor u kojem možemo proslijediti niz bajtova i skup znakova kao argument. Stoga se sljedeća izjava također može koristiti za pretvaranje niza bajtova u niz u Javi.
String str = new String(byteArray, StandardCharsets.UTF_8)
Klasa String također ima konstruktor za pretvaranje podskupa niza bajtova u String.
String(byte[] bytes, int offset, int length, String charsetName)
Pogledajmo još jedan primjer u kojem se koristi drugačije kodiranje.
Primjer
import java.io.UnsupportedEncodingException; public class ByteArraytoStringExample3 { public static void main(String args[]) { try { byte[] bytes = new byte[] { 75, 69, 82, 115, 121, 90, 43, 98, -30}; //bytes in ASCII code String utf = new String(bytes, 'UTF-8'); //converts into UTF-8 encoding String cp1252 = new String(bytes, 'Cp1252'); //conversts into Cp1252 endcoding //converts into windows-1252 encoding String windows1252 = new String(bytes, 'Windows-1252'); System.out.println('String in UTF-8 encoding : ' + utf); System.out.println('String in Cp1252 encoding : ' + cp1252); System.out.println('string Windows-1252 encoding : ' + windows1252); } catch(Exception e) { e.printStackTrace(); } } }
Izlaz: