Notre première chaîne de wchar_t
Nous y sommes ! Voyons maintenant comment créer puis afficher une chaîne de caractères accentués. Nous allons nous exercer sur des caractères simples, les caractères ASCII étendu, qui incluent les è, î, à, etc. En effet, le type
wchar_t permet de stocker bien d'autres caractères mais compilateur et consoles pourraient se montrer capricieux, comme je l'ai déjà expliqué.
Comme je vous l'ai dit, il faut d'abord utiliser un nouveau type de caractère. Fini le type char, dorénavant nous utiliserons le type wchar_t.
Si les chaînes standard sont des tableaux de char, les chaînes ASCII étendu sont
des tableaux de wchar_t. Rien ne change à ce niveau-là !
Ce code créé un tableau de 50
wchar_t, donc 49 caractères.
Code : C | #include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
int main()
{
wchar_t texte[50];
return 0;
}
|
Même avec le type wchar_t il ne faut pas oublier le fameux '\0', caractère qui termine toute chaîne de texte ! Attention aux pièges...
Voyons maintenant comment initialiser cette chaîne avec le texte "Salut !"
Essayons ce code :
Code : C | #include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
int main()
{
wchar_t texte[50] = "Salut !";
return 0;
}
|
Aïe, ça ne fonctionne pas

...
C'est tout à fait normal, vu que ce code tente de remplir une chaîne
wchar_t avec une chaîne classique ! Les deux types sont différents, et donc ça coince à la compilation...
Pour spécifier au compilateur qu'il s'agit d'une chaîne
wchar_t étendu, vous
DEVEZ ajouter un L avant les guillemets. Ainsi, ce code est parfaitement correct.
Code : C | wchar_t texte[50] = L"Salut !";
|
Attention : ce n'est pas à ce stade que vous pouvez ajouter des accents. En effet, ce code a de gros risques de planter à la compilation !
Code : C | wchar_t texte[50] = L"Salut Gérard !";
|
Notez que si le type wchar_t vous autorise à gérer les caractères accentués, il ne vous autorise pas à en insérer dans votre code ! Par exemple, n'appelez jamais une variable "chaîne", ou "élément", vous risquez de gros plantages !
Mais alors, comment initialiser cette chaîne si elle contient un
é ? Nous allons dans un premier temps faire comme au bon vieux temps, caractère par caractère. Ainsi, ce code est parfaitement correct. Notez qu'il faut ajouter le L avant la valeur de chaque lettre. Ce n'est pas indispensable, mais bien plus propre !
Code : C | wchar_t texte[50] = {L'S', L'a', L'l', L'u', L't', L' ', L'G', 130, L'r', L'a', L'r', L'd', L' ', L'!', L'\0'};
|
C'est quoi ce 130 qui traîne ?
Bonne question ! C'est en fait le
é de ce pauvre Gérard. Tous les compilateurs n'acceptent pas la notation
L'é', pourtant plus pratique. Il faut donc remplacer la lettre
é par sa valeur en ASCII étendu, et cette valeur, c'est 130.
Vous trouverez les valeurs ASCII étendu correspondant à chaque caractère
sur ce site.
Selon le compilateur que vous utilisez, certaines valeurs peuvent être complètement différentes des miennes ! Cela ne doit pas trop vous perturber, demandez de l'aide sur les forums pour connaître l'encodage de votre compilateur ou utilisez, comme moi, Code::Blocks avec le
GNU GCC Compiler 
.
Cette méthode d'initialisation n'est extrêmement pas pratique, c'est pourquoi il existe une petite astuce pour s'en passer : les échappements. Les échappements sont tout simplement des raccourcis pour faire figurer des caractères spéciaux dans l'initialisation d'un chaîne. Un échappement se présente sous la forme :
\xNN
NN est tout simplement la valeur ASCII du caractère à afficher. Elle doit être exprimée dans le système hexadécimal. Pour convertir un nombre standard en valeur hexadécimale, vous pouvez utiliser la calculatrice Windows ou un outil sur internet, en
voici un.
Revenons à notre code source de tout à l'heure. Je vous le remémore.
Code : C | wchar_t texte[50] = {L'S', L'a', L'l', L'u', L't', L' ', L'G', 130, L'r', L'a', L'r', L'd', L' ', L'!', L'\0'};
|
Plutôt terrible, n'est-ce pas ? Sachant que la valeur de "é" en ASCII est 130, et que cette valeur vaut 82 en hexadécimal, on va pouvoir utiliser pour "é" l'échappement
\x82 ! Voici le code en question.
Code : C | wchar_t texte[50] = L"Salut G\x82rard !";
|
Un peu plus commode, hein ?
Normalement, vous connaissiez déjà des échappements dits "spéciaux" : par exemple, \n pour le saut de ligne.
Afficher et récupérer une chaîne de wchar_t
Nous allons maintenant tester un bout de code qui devrait vous sembler intuitif, mais qui est vraiment archi-faux

!
Code : C | wchar_t texte[50] = {0};
fgets(texte, 50, stdin);
printf("%s", texte);
|
Il fallait s'en douter, ça ne marche pas. Ce serait trop beau !
Il manque en effet trois choses à ce code pour le rendre fonctionnel. Vous devez connaître la première.
- Il faut ajouter un L avant chaque guillemet représentant une chaîne. C'est primordial pour indiquer qu'il s'agit d'une chaîne de texte wchar_t !
- Les codes %c et %s, indiquant où insérer un caractère et une chaîne de caractères, ne fonctionnent plus ! Il faut les remplacer par leur équivalent, c'est-à-dire %lc et %ls !
- Enfin, TOUTES les fonctions de manipulation du texte doivent être remplacées par leurs équivalents dans la bibliothèque wchar.h. Ne faites pas ces têtes-là, ces fonctions sont heureusement similaires aux fonctions que vous connaissez, leur prototype sont quasiment les mêmes. Les char sont tout simplement remplacés par des wchar_t, et le nom de la fonction change légèrement. L'équivalent de printf est ainsi wprintf, et de fgets est... fgetws.
On doit réapprendre le nom des fonctions ?
Idéalement oui, mais vous trouverez un tableau de conversion préparé par mes soins à la fin du tuto. Et si vous utilisez les caractères spéciaux régulièrement, vous maîtriserez vite ces petits changements !
Code FAUX
Code : C | wchar_t texte[50] = {0};
fgets(texte, 50, stdin);
printf("%s", texte);
|
Code CORRECT
Code : C | wchar_t texte[50] = {0};
fgetws(texte, 50, stdin);
wprintf(L"%ls", texte);
|
Résumons la situation
Vous y êtes ? Ce n'est pas si compliqué que ça ! En résumé, pour passer aux caractères spéciaux, il faut simplement...
- Remplacer le type char par le type wchar_t
- Remplacer les fonctions de gestion du texte par leurs équivalents
- Remplacer les marqueurs %c et %s (caractères et chaînes) par leurs équivalents %lc et %ls
- Ne pas oublier de caractériser un caractère ou une chaîne de wchar_t par la lettre L, comme dans L'A' ou L"Mon texte !"
- Penser aux échappements pour limiter les maux de tête
!