"Hej, Amigo!"

"Nu er det tid til endnu et interessant emne: kodninger."

"Måske har du allerede hørt et sted, at hvert tegn har en kode (tal). Det er derfor, tegntypen kan repræsentere både symboler og tal."

"For eksempel er koden for bogstavet 'A' i det engelske alfabet 65. 'B' er 66, 'C' er 67, og så videre. Der er unikke koder for store bogstaver, små bogstaver, kyrilliske bogstaver, kinesisk tegn (ja, masser af koder), tal og forskellige symboler. Kort sagt er der en kode for stort set alt, hvad du vil kalde et tegn."

"Så, hvert bogstav og tegn svarer til et eller andet tal?"

"Nøjagtigt."

"Et tegn kan konverteres til et tal og et tal til et tegn. Java ser generelt ikke forskel på 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 kodning er et sæt symboler og deres tilsvarende sæt af koder. Men ikke kun én kodning er blevet opfundet - der er en hel del. Det var først senere, at en almindelig universel kodning, Unicode, blev opfundet."

"Men uanset hvor mange universelle standarder, der er opfundet, er der ingen, der har travlt med at opgive de gamle. Og så sker alting ligesom i denne tegneserie:"

Tegnkodninger - 1

"Forestil dig, at Vincent og Nick beslutter sig for at lave deres egne indkodninger."

"Her er Vincents kodning:"
Tegnkodninger - 2

"Og her er Nicks kodning:"
Tegnkodninger - 3

"De bruger endda de samme tegn, men koderne for tegnene er forskellige."

"Når strengen 'ABC-123' er skrevet til en fil ved hjælp af Vincents kodning, får vi følgende sæt bytes:"
Tegnkodninger - 4

"Og nu vil et andet program, der bruger Nicks kodning, læse filen:"

"Her er, hvad den vil læse: «345-IJK»."

"Og det værste er, at kodninger typisk ikke er gemt nogen steder i filer, så udviklere må gætte."

"Nå, hvordan gætter de dem?"

"Det er et andet emne. Men jeg vil gerne forklare, hvordan man arbejder med kodninger. Som du allerede ved, er størrelsen på et tegn i Java to bytes. Og Java Strings bruger Unicode-formatet."

"Men Java lader dig konvertere en streng til et sæt bytes i enhver kodning, den kender. String-klassen har specielle metoder til dette. Java har også en speciel Charset-klasse, der beskriver en specifik kodning."

1) Hvordan får jeg en liste over alle de kodninger, Java understøtter?

"Der er en særlig statisk metode kaldet availableCharsets til det. "Denne metode returnerer et sæt par (kodningsnavn, objekt, der beskriver kodningen):"

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

"Hver kodning har et unikt navn. Her er nogle af dem: UTF-8, UTF-16, Windows-1251, KOI8-R,..."

2) Hvordan får jeg den aktuelle aktive kodning (Unicode)?

"Der er en speciel metode kaldet defaultCharset til det.

Charset currentCharset = Charset.defaultCharset();

3) Hvordan konverterer jeg en streng til en specifik kodning?

"I Java kan du konvertere en streng til et byte-array i enhver kodning, som Java kender:"

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 læser fra en fil til en streng, hvis jeg ved, hvad dens kodning var i filen?

"Dette er endnu nemmere. String-klassen har en speciel 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 et byte-array fra en kodning til en anden?

"Der er mange måder. Her er en af ​​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 tænkte. Tak for den interessante lektion, Rishi."