L3 - Génie Logiciel – Jeux et encodage de caractères
Des caractères aux octets
Vous allez étudier dans ce TP l’encodage des caractères dans un jeu (attribuant à un caractère
un numéro entier), puis le transfert des numéros dans les jeux sous forme de suite d’octets.
Pour tester vos scripts ou programmes avec des caractères intéressants, dont la transformation
en suite d’octets est intéressante d’un jeu de caractère à un autre (par exemple Unicode, Latin-
1 ou JIS X 0208) et d’un format de transfert à un autre (par exemple UTF-8, Latin-1 ou Shift-
JIS), basez vous sur les caractères mentionnés à la fin de cet énoncé.
Scripts bash
Visualisation de la locale en cours d’utilisation :
$ locale
Locales actuellement disponibles sur le système :
$ locale -a
Changement de la locale de la session courante :
$ LC_ALL=de_DE.utf8
$ date
Mo 15. Okt 15:34:11 CEST 2012
$ date
Mon Oct 15 15:33:24 CEST 2012
Programme en C++
Créez un programme en C++, sous Eclipse CDT ou en ligne de commande. Votre programme
est idéalement en C++11 (sous Eclipse, clic droit sur le projet type Managed C++ Build, puis
Advertisement
C/C++ Build > Settings > Dialect > Language standard > ISO C++ 11).
Il doit contenir le code de démarrage suivant :
#include <iostream>
int main(int argc, char **argv)
{
return 0 ;
}
Avec le débogueur ou avec la console, testez la représentation des chaînes avec char[],
std::string et std::wstring. Il est recommandé de compiler en C++11 votre programme.
Pour demander à la sortie standard d’encoder une chaîne avec un encodage précis, utiliser
iostream::imbue. Rappelons que, par défaut, std::cout et std::wcout utilisent la locale du stdout
du C.
std::ios_base::sync_with_stdio(false);
std::wcout.imbue(locale(“fr_FR.utf8”));
[email protected] - 2019
Veillez à bien maîtriser l’encodage du code source lui-même de votre fichier C++. Rappelez-
vous que le compilateur (gcc) considère que le fichier source est encodé suivant la variable
LANG de la session courante.
Programme C++ avancé
Créez un programme C++. Faites saisir à l’utilisateur une chaine de caractère et afficher une
suite d’entiers dans la console correspondant à l’encodage ISO-8859-1 de cette chaine. Indice :
utilisez la fonction C++11 codecvt (veillez à bien configurer le compilateur pour compiler en
Advertisement
C++11).
Programme Java
Veillez à bien maîtriser l’encodage du fichier .java que vous éditez. Dans Eclipse, l’encodage est
visible dans les Preferences.
Démarrez un programme Java et testez les caractères Unicode dans les chaines, la conversion
en UTF-8, voire en ISO-8859-1 (Latin-1). Pour tester des caractères Unicode complexes,
regardez les exemples en bas de ce document.
Page web HTML
Votre fichier doit comporter la mention de l’encodage dans la section header :
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
C’est rigoureusement impératif pour que le navigateur interprète correctement la suite d’octets
que constitue le fichier qui lui est donné. Pour faire un test, mettez des accents dans le corps de
la page, et configurez votre éditeur de texte pour qu’il sauvegarde le fichier en Latin-1 (iso-
8859-1), puis en UTF-8. Changez la balise meta et observez les résultats.
Faites un hexdump de la page html pour voir si l’encodage correspond bien à vos attentes.
Programme PHP
Ouvrez un shell et tapez
$ php -S localhost:8000
Cela sert le répertoire courant dans un petit serveur Web.
Depuis un autre shell, éditer un fichier « test.php » contenant des instructions manipulant des
chaînes de caractères. Veillez à ce que ces chaînes soient correctement encodées, en utilisant les
bonnes API. Par exemple, pour afficher une variable :
Advertisement
<script>
var myvar = <?php echo json_encode($myVarValue); ?>;
window.alert(myvar);
</script>
Faites la même chose pour encoder du contenu HTML textuel, dans un élément (innerHTML),
et dans un attribut d’élément. Choisissez un contenu comportant des caractères Unicode :
[email protected] - 2019
$unicodeChar = "\u{1000}";
Ou bien encodez vous-même la chaîne en UTF-8 par exemple, comme suit :
<?php
header('content-type:text/html;charset=utf8');
?>
<html>
<head>
</head>
<body>
<?php
echo("\xE3\x82\xA2"); // affiche un caractère oriental
?>
</body>
</html>
Vous pouvez également ajouter un tag meta à votre page et voir quel encodage votre
Advertisement
navigateur choisi ; celui du code HTML, ou bien celui des headers (ce qui doit normalement
être le cas).
Enfin, initialisez la locale de PHP avec la locale correspondant au navigateur client. Le
navigateur client envoie sa locale dans sa requête HTTP. Pour visualiser la totalité des headers
envoyés depuis votre navigateur, aller sur :
https://manytools.org/http-html-text/http-request-headers/
Caractères Unicode pour tester
Vous pouvez tester votre programme avec les caractères Unicode suivant :
C/C++ : UTF-32 : \U0001F309 ou \U0002008A (caractère « Han » U+2008A).
Rappelons qu’en C/C++ il est possible d’utiliser la séquence d’échappement \UXXXXXXXX
pour représenter un caractère Unicode, ou bien \uXXXX si ce caractère tient dans un seul mot
16 bit UTF-16. Il n’est pas possible d’utiliser des surrogate pairs avec deux \u.
Java : UTF-16 : \ud83c\udf09 (Visuel :
)
Rappelons qu’en Java, il faut utiliser la représentation UTF-16. Ainsi, si un caractère utilise 2
mots UTF-16 (constituant une surrogate pair), il est possible de rentrer le caractère comme
indiqué ci-dessus.
[email protected] - 2019