|
|
||||||||||||||||||||||||||||||||
|
J'ai très rapidement abordé le sujet Unicode dans mon article sur une application portable Win32-WinCE. Je vais approfondir le sujet, pour que vous compreniez bien ce qui se cache derrière tout ceci.
L'industrie américaine fût la
première à diffuser des ordinateurs grand public. En 1980 Apple,
Commodore et autre Atari n'existaient qu'en version Anglo-saxonne :
Clavier QWERTY, notice en Anglais, pas d'accents ni de caractères
"non US". La préoccupation des constructeurs n'était pas
orienté grand public car ces machines s'adressaient à des passionnés
qui parlaient Anglais par la force des choses. La norme d'échange du
texte entre ces différents models est ASCII (American Standard Code for
Information Interchange), une table de 128 caractères définie par l'American
National Standards Institute (ANSI). Sur ces machines 8 bits un
caractère est codé sur un octets, soit 256 possibilités, et nous
avions des significations différents pour les caractères 128 à 255,
car aucune norme n'existait. Quand des constructeurs ont proposés des
machines spécifiques au pays (Amstrad CPC par exemple), les caractères
128 à 255 contenaient les lettres spécifiques au pays, les accents,
les cédilles, les trémas... mais chaque constructeur suivait sa norme.
Si vous voulez capitaliser vos développements C++ pour réutiliser vos classes pour Windows 95, NT et CE, une série de macro permettent d'avoir une seul code qui fonctionne en ANSI ou Unicode.
Si avant de faire #include <Windows.h> vous définissez les UNICODE et _UNICODE alors vous travaillez en Unicode (16 bits), sinon vous travaillez en ANSI (8 bits). Pour eVC c'est deux définitions sont toujours présentent, même si vous ne les mettez pas. TCHAR est le type qui représente un
caractère. Le zéro dans une chaîne, qui indique la fin de chaîne est toujours zéro en Unicode, mais un zéro sur 2 octets.
Pour passer de l'Unicode vers l'ANSI et vice-versa il existe les API WideCharToMultiByte et MultiByteToWideChar. ANSI->Unicode Unicode->ANSI Attention les API Windows attendent une longueur de buffer en caractères et non pas en octets. Donc méfiance avec sizeof qui retourne le nombre d'octets. L'astuce est d'utiliser sizeof(chaine)/sizeof(TCHAR), par exemple: TCHAR Buffer[512];
François Léger ma fait remarqué que
la gestion des fichiers textes Unicodes n'est pas naturelle. Effective
il faut connaître l'astuce du marqueur de début de flux. Comme chaque
caractère est codé sur un short, l'ordre de stockage mémoire est
important. Quand votre processeur est little endian (Intel et toute
machine Windows voir fichier Q102025)
la valeur sur deux octets (un short) 0x1234 est stockée en mémoire
0x34 0x12. Quand votre machine est big endian elle est stockée 0x12
0x34.
Exemple pour générer un tel fichier: // Très important d'ouvrir le fichier en binaire "wb"
// si "wt" est utilisé le texte est convertit en ANSI
FILE *file = _tfopen(TEXT("\\My Documents\\texte.txt"), TEXT("wb"));
#ifdef UNICODE
WCHAR BOM = 0xFEFF ;
fwrite (&BOM, sizeof(BOM), 1, file);
#endif
_ftprintf(file, TEXT("Fichier texte multi mode\n"));
fclose(file);
Unicode n'est pas compliqué mais c'est plus simple quand on sait ce qui se cache derrière tout ceci. Le support d'Unicode en natif dans Windows CE est une bonne chose, toutes les applications fonctionnent pour tous les pays. Par exemple si vous écrivez un programme qui possède une zone de saisie texte et bien il fonctionne aussi pour les Japonais et les Chinois. Je trouve cela drôlement pratique, et seul les PDA PocketPC sont capables de faire cela. |
||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
|
Copyright 2001-2004 - Tous droits réservés
|
||||||||||||||||||||||||||||||||
|
iPAQ
est un produit de COMPAQ.
|
||||||||||||||||||||||||||||||||