Bonjour,
Plutôt habitué aux langages de script, je tente (péniblement pour le moment) de me mettre au C. Comme mon premier objectif est de développer une "bête" application texte et que mon système (Linux) utilise UTF-8, j'essaie de me figurer comment gérer ça de manière "portable" (qu'au moins le programme se comporte pareillement en locale UTF-8 et en locale ISO-8859-* &cie). Voici pour le moment le laborieux résultat auquel j'arrive :
Il compile sans émettre d'avertissements, mais se comporte bizarrement à l'exécution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> #include <wchar.h> int main (int argc, char *argv[]) { setlocale(LC_CTYPE, ""); mbstate_t state; memset(&state, 0, sizeof(state)); const char *str = argv[1]; size_t l = strlen(str); wchar_t wstr[l]; size_t wl = mbsrtowcs(wstr, &str, l, &state); if (l > wl) { printf("YES %-10ls%s\n", wstr, "ok"); wprintf(L"OUI %-10s%s\n", wstr, "ok"); } else { printf("NO %-10s%s\n", argv[1], "ok"); } printf(" %-10s%s\n", "ok", "ok"); return EXIT_SUCCESS; }
Dans le premier cas, on voit qu'aucun caractère large n'a été détecté dans l'argument et que l'alignement des champs est correct. Dans le second, au contraire, c'est alignement est faut alors que les caractère larges on bien été détectés et qu'en conséquence l'emploi de "%ls" pour imprimer la chaîne devrait assurer une représentation correcte (alors qu'ici les caractères accentués comptent double) ; pire même, l'instruction wprintf a purement et simplement été ignorée.$ gcc -Wall -o /tmp/out testlocale.c $ /tmp/out dodo NO dodo ok ok ok $ /tmp/out dédé YES dédé ok ok ok
Pour le wprintf, j'ai trouvé cet élément de réponse, mais jouer avec fwide amène au mieux à supprimer toute sortie. Bref, je sèche complètement à comprendre comment obtenir une représentation correcte des caractères ici. Est-ce que par hasard quelqu'un connaîtrait la/une bonne manière de s'y prendre ? D'avance merci.
(En question subsidiaire, sans vouloir abuser du forum, j'aimerais également comprendre pourquoi remplacer argv[1] par str dans l'avant-dernier printf aboutit à l'impression d'un champ de taille correcte mais sans la chaine... )
Partager