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 :

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;
}
Il compile sans émettre d'avertissements, mais se comporte bizarrement à l'exécution :

$ 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
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.

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... )