"Hei, Amigo!"

"Nå er det tid for et annet interessant emne: kodinger."

"Kanskje du allerede har hørt et sted at hvert tegn har en kode (tall). Det er derfor tegntypen kan representere både symboler og tall."

"For eksempel er koden for bokstaven 'A' i det engelske alfabetet 65. 'B' er 66, 'C' er 67, og så videre. Det er unike koder for store bokstaver, små bokstaver, kyrilliske bokstaver, kinesisk tegn (ja, massevis av koder), tall og forskjellige symboler. Kort sagt, det er en kode for praktisk talt alt du vil kalle et tegn."

"Så, hver bokstav og tegn tilsvarer et tall?"

"Nøyaktig."

"Et tegn kan konverteres til et tall, og et tall til et tegn. Java ser vanligvis ingen forskjell mellom dem:"

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

"Interessant."

"Så, en koding er et sett med symboler og deres tilsvarende sett med koder. Men ikke bare én koding er oppfunnet – det er ganske mange. Det var ikke før senere at en vanlig universell koding, Unicode, ble oppfunnet."

"Men uansett hvor mange universelle standarder som er oppfunnet, er det ingen som har det travelt med å forlate de gamle. Og så skjer alt akkurat som i denne tegneserien:"

Tegnkodinger - 1

"Se for deg at Vincent og Nick bestemmer seg for å lage sine egne kodinger."

"Her er Vincents koding:"
Tegnkodinger - 2

"Og her er Nicks koding:"
Tegnkodinger - 3

"De bruker til og med de samme tegnene, men kodene for karakterene er forskjellige."

"Når strengen 'ABC-123' er skrevet til en fil med Vincents koding, får vi følgende sett med byte:"
Tegnkodinger - 4

"Og nå ønsker et annet program som bruker Nicks koding å lese filen:"

"Her er hva den vil lese: «345-IJK»."

"Og det verste er at kodinger vanligvis ikke er lagret noe sted i filer, så utviklere må gjette."

"Vel, hvordan gjetter de dem?"

"Det er et annet emne. Men jeg vil forklare hvordan man jobber med kodinger. Som du allerede vet, er størrelsen på en char i Java to byte. Og Java Strings bruker Unicode-formatet."

"Men Java lar deg konvertere en streng til et sett med byte i hvilken som helst koding den kjenner. String-klassen har spesielle metoder for dette. Java har også en spesiell Charset-klasse som beskriver en spesifikk koding."

1) Hvordan får jeg en liste over alle kodingene som Java støtter?

"Det er en spesiell statisk metode kalt tilgjengeligeCharsets for det. "Denne metoden returnerer et sett med par (kodingsnavn, objekt som beskriver kodingen):"

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

"Hver koding har et unikt navn. Her er noen av dem: UTF-8, UTF-16, Windows-1251, KOI8-R,..."

2) Hvordan får jeg den gjeldende aktive kodingen (Unicode)?

"Det er en spesiell metode kalt defaultCharset for det.

Charset currentCharset = Charset.defaultCharset();

3) Hvordan konverterer jeg en streng til en spesifikk koding?

"I Java kan du konvertere en streng til en byte-array i hvilken som helst koding som Java kjenner:"

Metode Eksempel
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) Hvordan konverterer jeg en byte-array som jeg leser fra en fil til en streng, hvis jeg vet hva dens koding var i filen?

"Dette er enda enklere. String-klassen har en spesiell konstruktør:"

Metode Eksempel
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) Hvordan konverterer jeg en byte-array fra en koding til en annen?

"Det er mange måter. Her er en av de enkleste:"

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);

"Det var det jeg tenkte. Takk for den interessante leksjonen, Rishi."