« Salut Amigo ! »

"Maintenant, il est temps d'aborder un autre sujet intéressant : les encodages."

"Peut-être avez-vous déjà entendu quelque part que chaque caractère a un code (numéro). C'est pourquoi le type char peut représenter à la fois des symboles et des chiffres."

"Par exemple, le code de la lettre 'A' dans l'alphabet anglais est 65. 'B' est 66, 'C' est 67, etc. Il existe des codes uniques pour les lettres majuscules, minuscules, cyrilliques, chinois caractères (oui, beaucoup, beaucoup de codes), chiffres et divers symboles. En bref, il existe un code pour pratiquement tout ce que vous appelleriez un caractère.

"Alors, chaque lettre et caractère correspond à un certain nombre?"

"Précisément."

"Un caractère peut être converti en nombre et un nombre en caractère. Java ne voit généralement pas de différence entre eux :"

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

"Intéressant."

"Ainsi, un encodage est un ensemble de symboles et leur ensemble de codes correspondant. Mais pas un seul encodage n'a été inventé, il y en a plusieurs. Ce n'est que plus tard qu'un encodage universel commun, Unicode, a été inventé."

"Mais peu importe le nombre de normes universelles inventées, personne n'est pressé d'abandonner les anciennes. Et puis tout se passe comme dans ce dessin animé :"

Encodages de caractères - 1

"Imaginez que Vincent et Nick décident de faire leurs propres encodages."

"Voici l'encodage de Vincent :"
Encodages de caractères - 2

"Et voici l'encodage de Nick :"
Encodages de caractères - 3

"Ils utilisent même les mêmes caractères, mais les codes des caractères sont différents."

"Lorsque la chaîne 'ABC-123' est écrite dans un fichier à l'aide de l'encodage de Vincent, nous obtenons l'ensemble d'octets suivant :"
Encodages de caractères - 4

"Et maintenant, un autre programme qui utilise l'encodage de Nick veut lire le fichier :"

"Voici ce qu'il va lire : "345-IJK"."

"Et le pire, c'est que les encodages ne sont généralement stockés nulle part dans les fichiers, les développeurs doivent donc deviner."

"Eh bien, comment les devinent-ils?"

"C'est un sujet différent. Mais je veux expliquer comment travailler avec les encodages. Comme vous le savez déjà, la taille d'un caractère en Java est de deux octets. Et Java Strings utilise le format Unicode."

"Mais Java vous permet de convertir une chaîne en un ensemble d'octets dans n'importe quel encodage qu'il connaît. La classe String a des méthodes spéciales pour cela. Java a également une classe spéciale Charset qui décrit un encodage spécifique."

1) Comment puis-je obtenir une liste de tous les encodages supportés par Java ?

"Il existe une méthode statique spéciale appelée availableCharsets pour cela. "Cette méthode renvoie un ensemble de paires (nom d'encodage, objet décrivant l'encodage) :"

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

"Chaque encodage porte un nom unique. En voici quelques-uns : UTF-8, UTF-16, Windows-1251, KOI8-R,…"

2) Comment puis-je obtenir l'encodage actif actuel (Unicode) ?

"Il existe une méthode spéciale appelée defaultCharset pour cela.

Charset currentCharset = Charset.defaultCharset();

3) Comment convertir une chaîne en un encodage spécifique ?

"En Java, vous pouvez convertir une chaîne en un tableau d'octets dans n'importe quel encodage connu de Java :"

Méthode Exemple
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) Comment puis-je convertir un tableau d'octets que j'ai lu à partir d'un fichier en une chaîne, si je sais quel était son encodage dans le fichier ?

"C'est encore plus simple. La classe String a un constructeur spécial :"

Méthode Exemple
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) Comment convertir un tableau d'octets d'un encodage à un autre ?

"Il existe plusieurs façons. Voici l'une des plus simples :"

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

"C'est ce que je pensais. Merci pour cette leçon intéressante, Rishi."