L3 - Génie Logiciel – Manipulation des locales
Ce TP porte sur la manipulation des locales, c’est-à-dire la régionalisation des applications selon la culture de l’utilisateur connecté. Vous apprendrez à visualiser, modifier et utiliser les locales dans différents environnements : shell Linux, C++, pages web avec JavaScript, Java et PHP.
D'après le document L3 - Génie Logiciel – Manipulation des locales
Cet article a été rédigé automatiquement à partir du document source, puis vérifié avant publication.
Document source
Programming, Math, etc. · PDF · 3 pages · 2012
Afficher l'aperçu du document
Ce TP porte sur la manipulation des locales, c’est-à-dire la régionalisation des applications selon la culture de l’utilisateur connecté. Vous apprendrez à visualiser, modifier et utiliser les locales dans différents environnements : shell Linux, C++, pages web avec JavaScript, Java et PHP. Ce TP nécessite un environnement Linux avec locales configurées, un compilateur C++11, un serveur PHP local, et un éditeur pour créer des pages HTML et programmes.
Objectifs
- Visualiser et modifier la locale courante dans un terminal Linux.
- Programmer en C++ la gestion des locales et afficher des dates localisées.
- Créer une page web HTML/JavaScript affichant des dates selon différentes locales.
- Écrire un programme Java affichant une date selon la locale utilisateur.
- Manipuler les locales et encodages dans un environnement PHP avec un serveur local.
- Comprendre la gestion des caractères Unicode dans différents langages.
Prérequis et configuration
- Un système Linux avec locales configurées (fichiers dans /etc/locale.gen).
- Un terminal avec accès aux commandes locale et date.
- Un compilateur C++ supportant la norme C++11 (ex : GCC 4.8+).
- Un environnement de développement Eclipse CDT (optionnel).
- Un navigateur web moderne supportant JavaScript.
- Un serveur PHP local (ex : PHP 7.x) lancé via
php -S localhost:8000. - Connaissances de base en programmation C++, Java, PHP, HTML et JavaScript.
Visualisation et modification des locales dans le terminal
Commencez par observer la locale actuellement utilisée dans votre session :
$ locale
Pour connaître toutes les locales disponibles sur votre système :
$ locale -a
Pour changer temporairement la locale de votre session, par exemple en allemand :
$ LC_ALL=de_DE.utf8
$ date
Mo 15. Okt 15:34:11 CEST 2012
$ date
Mon Oct 15 15:33:24 CEST 2012
La commande date affiche la date dans la locale courante. Ici, on observe la différence entre la locale allemande et la locale par défaut.
Programme C++ pour manipulation des locales
Créez un programme C++ minimal avec le code suivant :
#include <iostream>
int main(int argc, char **argv)
{
return 0 ;
}
Compilez en C++11 (par exemple sous Eclipse CDT, sélectionnez ISO C++ 11 dans les paramètres du projet).
Testez la représentation des chaînes avec char[], std::string et std::wstring. Ensuite, modifiez la locale courante en début de programme avec :
setlocale(LC_ALL, "locale");
Remplacez "locale" par une locale valide présente dans /etc/locale.gen.
Affichez une date formatée selon la locale courante, puis selon la locale allemande de_DE, pour observer les différences de représentation des caractères Unicode.
Création d’une page web HTML affichant des dates localisées
Créez un fichier HTML avec un encodage spécifié dans l’en-tête :
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
Écrivez un script JavaScript pour afficher une date localisée :
<script type="text/javascript">
var d = new Date(Date.UTC(2019, 03, 26, 3, 0, 0));
document.write(d.toLocaleDateString());
</script>
Testez l’affichage de la date dans la locale de l’utilisateur connecté, puis dans une autre locale comme en_US. Explorez aussi d’autres fonctions de localisation, par exemple pour les nombres.
Programme Java affichant une date selon la locale utilisateur
Dans Eclipse, créez un programme Java avec le code suivant :
Locale loc = Locale.getLocale(); // locale courante
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, loc);
String formattedDate = df.format(yourDate);
Remplacez yourDate par un objet Date valide. Vérifiez que la locale utilisée correspond bien à celle lue depuis un shell Linux. Essayez avec d’autres locales pour observer les différences de format.
Manipulation des locales et encodages en PHP
Lancez un serveur PHP local dans un terminal :
$ php -S localhost:8000
Dans un autre terminal, créez un fichier test.php contenant des instructions manipulant des chaînes de caractères avec encodage correct. Par exemple, pour afficher une variable JavaScript initialisée par PHP :
<script>
var myvar = <?php echo json_encode($myVarValue); ?>;
window.alert(myvar);
</script>
Faites de même pour insérer du contenu HTML textuel dans un élément via innerHTML et dans un attribut HTML, en choisissant des chaînes comportant des caractères Unicode.
Exemple d’utilisation de caractères Unicode :
$unicodeChar = "\u{1000}";
Ou encodez vous-même une chaîne en UTF-8 :
<?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 ajouter un tag meta pour spécifier l’encodage dans la page HTML et vérifier quel encodage le navigateur utilise : celui du code HTML ou celui des headers HTTP (normalement, ce sont les headers qui priment).
Enfin, initialisez la locale PHP à partir de la locale envoyée par le navigateur client dans la requête HTTP. Pour visualiser les headers HTTP envoyés par votre navigateur, utilisez :
https://manytools.org/http-html-text/http-request-headers/
Utilisation de caractères Unicode spécifiques
Vous pouvez tester votre programme avec les caractères Unicode suivants :
- Caractère Unicode U+1F309 :
\U0001F309 - UTF-16 :
\ud83c\udf09 - UTF-32 :
\U0002008A
Exemples d’écriture en différents langages :
- En C :
wchar_t s[] = "𠂊"; - En C++ :
std::string = u8"𠂊"; - En Java : utiliser la représentation UTF-16 avec deux mots (surrogate pairs).
Sous Linux, la variable s ci-dessus est traitée comme un seul mot 32 bits UTF-32 représentant le caractère Han U+2008A.
Résultats attendus
- Affichage correct des locales disponibles et de la locale courante dans le terminal.
- Changement temporaire de la locale avec
LC_ALLmodifiant l’affichage des dates. - Programme C++ compilé en C++11 affichant des dates localisées, avec gestion correcte des chaînes Unicode.
- Page HTML affichant la date du jour selon la locale de l’utilisateur et une autre locale, sans problème d’encodage.
- Programme Java affichant une date formatée selon la locale courante détectée.
- Serveur PHP local fonctionnel, affichant des chaînes Unicode correctement encodées dans les pages servies.
- Affichage correct des caractères Unicode spécifiques dans tous les langages testés.
Pièges courants
- Ne pas spécifier l’encodage dans les pages HTML peut provoquer des problèmes d’affichage des caractères spéciaux.
- Changer la locale dans le terminal avec
LC_ALLne modifie pas la locale du système, seulement celle de la session en cours. - En C++, oublier de compiler en C++11 peut empêcher l’utilisation correcte des chaînes Unicode modernes.
- En PHP, ne pas envoyer les bons headers d’encodage (
content-type) peut causer des erreurs d’affichage. - En Java, mal gérer les surrogate pairs UTF-16 peut conduire à des erreurs lors de l’affichage de caractères hors BMP.
- Confondre l’encodage des fichiers source et celui spécifié dans les pages HTML ou les headers HTTP.
- Ne pas vérifier les locales disponibles dans
/etc/locale.genpeut empêcher la sélection d’une locale valide.
Commentaires
Aucun commentaire pour le moment. Posez la première question.