„Hallo, Amigo!“

„Jetzt ist es Zeit für ein weiteres interessantes Thema: Kodierungen.“

„Vielleicht haben Sie schon irgendwo gehört, dass jedes Zeichen einen Code (Zahl) hat. Deshalb kann der Typ char sowohl Symbole als auch Zahlen darstellen.“

„Zum Beispiel lautet der Code für den Buchstaben „A“ im englischen Alphabet 65. „B“ ist 66, „C“ ist 67 usw. Es gibt eindeutige Codes für Großbuchstaben, Kleinbuchstaben, kyrillische Buchstaben und Chinesisch Zeichen (ja, viele, viele Codes), Zahlen und verschiedene Symbole. Kurz gesagt, es gibt einen Code für praktisch alles, was man als Zeichen bezeichnen würde.“

„Also entspricht jeder Buchstabe und jedes Zeichen einer Zahl?“

"Genau."

„Ein Zeichen kann in eine Zahl umgewandelt werden und eine Zahl in ein Zeichen. Java erkennt im Allgemeinen keinen Unterschied zwischen ihnen:“

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

"Interessant."

„Eine Kodierung ist also eine Reihe von Symbolen und deren entsprechende Reihe von Codes. Es wurde jedoch nicht nur eine Kodierung erfunden – es gibt eine ganze Reihe. Erst später wurde eine gemeinsame universelle Kodierung, Unicode, erfunden.“

„Aber egal wie viele universelle Standards erfunden werden, niemand hat es eilig, die alten aufzugeben. Und dann passiert alles wie in diesem Cartoon:“

Zeichenkodierungen – 1

„Stellen Sie sich vor, Vincent und Nick beschließen, ihre eigenen Kodierungen zu erstellen.“

„Hier ist Vincents Kodierung:“
Zeichenkodierungen – 2

„Und hier ist Nicks Kodierung:“
Zeichenkodierungen – 3

„Sie verwenden sogar die gleichen Zeichen, aber die Codes für die Zeichen sind unterschiedlich.“

„Wenn die Zeichenfolge ‚ABC-123‘ mit Vincents Kodierung in eine Datei geschrieben wird, erhalten wir den folgenden Satz Bytes:“
Zeichenkodierungen – 4

„Und jetzt möchte ein anderes Programm, das Nicks Kodierung verwendet, die Datei lesen:“

„Hier ist, was es lesen wird: «345-IJK».“

„Und das Schlimmste ist, dass Kodierungen normalerweise nirgendwo in Dateien gespeichert werden, sodass Entwickler raten müssen.“

„Nun, wie erraten sie sie?“

„Das ist ein anderes Thema. Aber ich möchte erklären, wie man mit Kodierungen arbeitet. Wie Sie bereits wissen, beträgt die Größe eines Zeichens in Java zwei Bytes. Und Java-Strings verwenden das Unicode-Format.“

„Aber Java ermöglicht es Ihnen, einen String in eine Reihe von Bytes in jeder ihm bekannten Codierung umzuwandeln. Die String-Klasse verfügt hierfür über spezielle Methoden. Java verfügt auch über eine spezielle Charset-Klasse, die eine bestimmte Codierung beschreibt.“

1) Wie erhalte ich eine Liste aller von Java unterstützten Kodierungen?

„Dafür gibt es eine spezielle statische Methode namens availableCharsets. „Diese Methode gibt eine Reihe von Paaren zurück (Codierungsname, Objekt, das die Codierung beschreibt):“

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

„Jede Kodierung hat einen eindeutigen Namen. Hier sind einige davon: UTF-8, UTF-16, Windows-1251, KOI8-R,…“

2) Wie erhalte ich die aktuell aktive Kodierung (Unicode)?

„ Dafür gibt es eine spezielle Methode namens defaultCharset .

Charset currentCharset = Charset.defaultCharset();

3) Wie konvertiere ich einen String in eine bestimmte Codierung?

„In Java können Sie einen String in jeder Codierung, die Java kennt, in ein Byte-Array konvertieren:“

Methode Beispiel
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) Wie konvertiere ich ein Byte-Array, das ich aus einer Datei gelesen habe, in einen String, wenn ich weiß, wie seine Codierung in der Datei war?

„Das ist noch einfacher. Die String-Klasse hat einen speziellen Konstruktor:“

Methode Beispiel
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) Wie konvertiere ich ein Byte-Array von einer Codierung in eine andere?

„Es gibt viele Möglichkeiten. Hier ist eine der einfachsten:“

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

„Das habe ich mir auch gedacht. Danke für die interessante Lektion, Rishi.“