– Szia Amigo!

– Itt az ideje egy másik érdekes témának: a kódolásoknak.

"Talán hallottál már valahol, hogy minden karakternek van egy kódja (száma). Ezért a char típus jelképezhet szimbólumokat és számokat is."

"Például az "A" betű kódja az angol ábécében 65. A "B" 66, a "C" a 67 és így tovább. Vannak egyedi kódok a nagybetűkre, kisbetűkre, cirill betűkre, kínaira karakterek (igen, sok-sok kód), számok és különféle szimbólumok. Röviden, gyakorlatilag mindenre van kód, amit karakternek neveznénk."

– Tehát minden betű és karakter valamilyen számnak felel meg?

"Pontosan."

"Egy karakter számmá alakítható, a szám pedig karakterré. A Java általában nem lát különbséget közöttük:"

char c = 'A'; //The code (number) for 'A' is 65
c++; //Now c contains the number 66, which is the code for 'B'

"Érdekes."

"Tehát a kódolás szimbólumok halmaza és a hozzájuk tartozó kódkészlet. De nem csak egy kódolást találtak fel – elég sok van. Csak később találták fel a közös univerzális kódolást, a Unicode-ot."

"De akárhány univerzális szabványt találnak ki, senki sem siet a régiek elhagyásával. Aztán minden úgy történik, mint ebben a rajzfilmben:"

Karakterkódolások – 1

"Képzeld el, hogy Vincent és Nick úgy döntenek, hogy elkészítik a saját kódolásukat."

"Íme Vincent kódolása:"
Karakterkódolások – 2

– És itt van Nick kódolása:
Karakterkódolások – 3

– Még ugyanazokat a karaktereket is használják, de a karakterek kódjai eltérőek.

"Ha az "ABC-123" karakterláncot Vincent kódolásával írjuk egy fájlba, a következő bájtkészletet kapjuk:
Karakterkódolások – 4

"És most egy másik program, amely Nick kódolását használja, be akarja olvasni a fájlt:"

"Íme, mi lesz rajta: «345-IJK».

"És a legrosszabb az, hogy a kódolásokat általában nem tárolják sehol fájlokban, így a fejlesztőknek ki kell találniuk."

– Nos, hogyan találják ki őket?

"Ez egy másik téma. De szeretném elmagyarázni, hogyan kell dolgozni a kódolással. Amint azt már tudod, egy karakter mérete Java-ban két bájt. A Java Strings pedig Unicode formátumot használ."

"A Java azonban lehetővé teszi, hogy egy karakterláncot bájtok készletévé alakítson át bármilyen kódolásban, amit ismer. A String osztálynak speciális metódusai vannak erre. A Java-nak van egy speciális Charset osztálya is, amely egy adott kódolást ír le."

1) Hogyan kaphatok listát a Java által támogatott összes kódolásról?

"Ehhez van egy speciális statikus metódus, az availableCharsets. "Ez a metódus egy pár halmazt ad vissza (kódolási név, a kódolást leíró objektum):"

SortedMap<String,Charset> charsets = Charset.availableCharsets();

"Minden kódolásnak egyedi neve van. Íme néhány ezek közül: UTF-8, UTF-16, Windows-1251, KOI8-R,…"

2) Hogyan szerezhetem be az aktuális aktív kódolást (Unicode)?

"Létezik egy defaultCharset nevű speciális módszer erre.

Charset currentCharset = Charset.defaultCharset();

3) Hogyan alakíthatok át egy karakterláncot egy adott kódolásra?

"A Java programban egy karakterláncot bájttömbbé konvertálhat olyan kódolásban, amelyet a Java ismer:"

Módszer Példa
byte[] getBytes()
String s = "Good news, everyone!";
byte[] buffer = s.getBytes()
byte[] getBytes(Charset charset)
String s = "Good news, everyone!";
Charset koi8 = Charset.forName("KOI8-R");
byte[] buffer = s.getBytes(koi8);
byte[] getBytes(String charsetName)
String s = "Good news, everyone!";
byte[] buffer = s.getBytes("Windows-1251")

4) Hogyan alakíthatok át egy fájlból kiolvasott bájttömböt Stringgé, ha tudom, hogy mi volt a kódolása a fájlban?

"Ez még egyszerűbb. A String osztálynak van egy speciális konstruktora:"

Módszer Példa
String(byte bytes[])
byte[] buffer = new byte[1000];
inputStream.read(buffer);

String s = new String(buffer);
String(byte bytes[], Charset charset)
byte[] buffer = new byte[1000];
inputStream.read(buffer);

Charset koi8 = Charset.forName("KOI8-R");
String s = new String(buffer, koi8);
String(byte bytes[], String charsetName)
byte[] buffer = new byte[1000];
inputStream.read(buffer);

String s = new String(buffer, "Windows-1251");

5) Hogyan alakíthatok át egy bájttömböt egyik kódolásról a másikra?

"Sok módszer létezik. Íme az egyik legegyszerűbb:"

Charset koi8 = Charset.forName("KOI8-R");
Charset windows1251 = Charset.forName("Windows-1251");

byte[] buffer = new byte[1000];
inputStream.read(buffer);
String s = new String(buffer, koi8);
buffer = s.getBytes(windows1251);
outputStream.write(buffer);

"Erre gondoltam. Köszönöm az érdekes leckét, Rishi."