– 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:"

"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:"
– És itt van Nick kódolása:
– 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:
"É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 |
---|---|
|
|
|
|
|
|
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 |
---|---|
|
|
|
|
|
|
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."
GO TO FULL VERSION