"Hej, Amigo!"

"Nu är det dags för ett annat intressant ämne: kodningar."

"Du kanske redan har hört någonstans att varje tecken har en kod (siffra). Det är därför teckentypen kan representera både symboler och siffror."

"Till exempel är koden för bokstaven 'A' i det engelska alfabetet 65. 'B' är 66, 'C' är 67 och så vidare. Det finns unika koder för stora bokstäver, gemener, kyrilliska bokstäver, kinesiska tecken (ja, massor av koder), siffror och olika symboler. Kort sagt, det finns en kod för praktiskt taget allt du skulle kalla ett tecken."

"Så, varje bokstav och tecken motsvarar någon siffra?"

"Exakt."

"Ett tecken kan konverteras till ett tal och ett tal till ett tecken. Java ser i allmänhet ingen skillnad mellan dem:"

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

"Intressant."

"Så, en kodning är en uppsättning symboler och deras motsvarande uppsättning koder. Men inte bara en kodning har uppfunnits – det finns en hel del. Det var inte förrän senare som en vanlig universell kodning, Unicode, uppfanns."

"Men oavsett hur många universella standarder som uppfinns, är det ingen som har bråttom att överge de gamla. Och sedan händer allt precis som i den här tecknade filmen:"

Teckenkodningar - 1

"Föreställ dig att Vincent och Nick bestämmer sig för att göra sina egna kodningar."

"Här är Vincents kodning:"
Teckenkodningar - 2

"Och här är Nicks kodning:"
Teckenkodningar - 3

"De använder till och med samma tecken, men koderna för tecknen är olika."

"När strängen 'ABC-123' skrivs till en fil med Vincents kodning får vi följande uppsättning byte:"
Teckenkodningar - 4

"Och nu vill ett annat program som använder Nicks kodning läsa filen:"

"Så här kommer det att stå: «345-IJK»."

"Och det värsta är att kodningar vanligtvis inte lagras någonstans i filer, så utvecklare måste gissa."

"Jaha, hur gissar de dem?"

"Det är ett annat ämne. Men jag vill förklara hur man arbetar med kodningar. Som du redan vet är storleken på ett tecken i Java två byte. Och Java Strings använder Unicode-formatet."

"Men Java låter dig konvertera en sträng till en uppsättning byte i vilken kodning den känner till. String-klassen har speciella metoder för detta. Java har också en speciell Charset-klass som beskriver en specifik kodning."

1) Hur får jag en lista över alla kodningar som Java stöder?

"Det finns en speciell statisk metod som kallas tillgängligaCharsets för det. "Denna metod returnerar en uppsättning par (kodningsnamn, objekt som beskriver kodningen):"

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

"Varje kodning har ett unikt namn. Här är några av dem: UTF-8, UTF-16, Windows-1251, KOI8-R,..."

2) Hur får jag den aktuella aktiva kodningen (Unicode)?

"Det finns en speciell metod som heter defaultCharset för det.

Charset currentCharset = Charset.defaultCharset();

3) Hur konverterar jag en sträng till en specifik kodning?

"I Java kan du konvertera en sträng till en byte-array i vilken kodning som helst som Java känner till:"

Metod Exempel
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) Hur konverterar jag en byte-array som jag läser från en fil till en sträng, om jag vet vad dess kodning var i filen?

"Detta är ännu enklare. String-klassen har en speciell konstruktor:"

Metod Exempel
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) Hur konverterar jag en byte-array från en kodning till en annan?

"Det finns många sätt. Här är ett av de enklaste:"

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 vad jag tänkte. Tack för den intressanta lektionen, Rishi."