Page 1 sur 1

[C printf] problème caractères accentués (résolu)

Publié : jeu. 08 juin 2017, 20:42
par avi3000
Bonjour,

Ce code

Code : Tout sélectionner

#!/usr/bin/tcc -run
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
void main() {
    printf("xx%22.20sxx\n", "01234567890123456789");
    printf("xx%-22.20sxx\n", "01234567890123456789");
    printf("xx%22.20s xx\n", "0éé34567890123456789");
    printf("xx%-22.20s xx\n", "0éé34567890123456789");
}
donne

Code : Tout sélectionner

xx  01234567890123456789xx
xx01234567890123456789  xx
xx  0éé345678901234567 xx
xx0éé345678901234567   xx
J'aimerais ceci :

Code : Tout sélectionner

xx  01234567890123456789xx
xx01234567890123456789  xx
xx  0éé34567890123456789xx
xx0éé34567890123456789   xx
merci

Re: [C printf] problème caractères accentués

Publié : jeu. 08 juin 2017, 20:49
par benjarobin
Bonjour,
Ceci est tout à fait normal. Le caractère "é" en UTF-8 nécessite 2 char et printf est assez "bête" il ne connaît pas l'UTF-8, il ne connaît que les char.
Sinon je ne savait même pas que l'on pouvait faire ce genre de chose avec printf sur les strings (je ne le faisait que sur les nombres)...

La vrai question c'est qu'est ce que tu veux faire vraiment ? Quel est ton besoin ?

Re: [C printf] problème caractères accentués

Publié : jeu. 08 juin 2017, 20:56
par avi3000
Mais ça je le savais,
j'ai cherché une solution simple sur la toile, mais je tourne en rond.

J'ai bien une solution :
appliquer un masque de transformation caractères double => caractère simple.
comparer la longueur de la chaine initiale et celle de la chaine transformée mais c'est lourd.
et bricoler le code .

le but est d'afficher proprement des listes de fichiers et de répertoires.

Re: [C printf] problème caractères accentués

Publié : jeu. 08 juin 2017, 21:00
par benjarobin
Je ne vois pas pourquoi tu aurais besoin de ceci pour afficher proprement des listes de fichiers et de répertoires.
Par exemple tree le fait très bien, et il ne regarde pas le contenu du nom du fichier.
A moins que ton but soit d'afficher plusieurs fichiers sur une même ligne... Je viens de vérifier "ls" y arrive, il faudrait voir comment il fait.
Le plus simple serait de tout traiter en unicode...

Re: [C printf] problème caractères accentués

Publié : jeu. 08 juin 2017, 21:59
par avi3000
Je n'ai pas trouvé de version unicode pour scandir et dirent.

Re: [C printf] problème caractères accentués

Publié : jeu. 08 juin 2017, 22:06
par benjarobin
Je pensais à une conversion à la volé via iconv, mais vraiment regarde comment est foutu le code de ls
Sinon pour ce genre de question, je recommande vivement stackoverflow

Re: [C printf] problème caractères accentués

Publié : jeu. 08 juin 2017, 22:51
par avi3000
avec mon niveau d'anglais, j'ai passé 2 bonnes heures de recherche sur stackoverflow et compagnie sans rien trouver de bien interessant.

Mais je pense avoir une solution simple et relativement rapide.

Je passe en résolu et je poste la solution dès que c'est propre.

Re: [C printf] problème caractères accentués

Publié : ven. 09 juin 2017, 10:21
par avi3000
La solution qui me semble la plus simple, la plus légère et la plus rapide est de compter le nombre de caractères non standard (< ' ' ou >'~').

Code : Tout sélectionner

#!/usr/bin/tcc -run
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define MACRO_QUI_VA_BIEN(_i, _u, _w, _p, _s) \
    _u = 0; \
    _i = strlen(_s); \
    while ( --_i > -1 )    _u += (_s[_i] < ' ' || _s[_i] > '~'); \
    _u >>= 1; \
    printf("||%*.*s||\n", _w + _u, _p + _u, _s); \
    printf("||%-*.*s||\n", _w + _u, _p + _u, _s)

void main() {
    unsigned char *s1 = "01234567890123456789";
    unsigned char *s2 = "0éàùç@~!890123456789";
    int i, u, w = 22, p = 22; 
    MACRO_QUI_VA_BIEN(i, u, w, p, s1);
    MACRO_QUI_VA_BIEN(i, u, w, p, s2);
    puts("-------");
    p = 15; 
    MACRO_QUI_VA_BIEN(i, u, w, p, s1);
    MACRO_QUI_VA_BIEN(i, u, w, p, s2);
    puts("-------");
    w = 19; 
    MACRO_QUI_VA_BIEN(i, u, w, p, s1);
    MACRO_QUI_VA_BIEN(i, u, w, p, s2);
}

Code : Tout sélectionner

||  01234567890123456789||
||01234567890123456789  ||
||  0éàùç@~!890123456789||
||0éàùç@~!890123456789  ||
-------
||       012345678901234||
||012345678901234       ||
||       0éàùç@~!8901234||
||0éàùç@~!8901234       ||
-------
||    012345678901234||
||012345678901234    ||
||    0éàùç@~!8901234||
||0éàùç@~!8901234    ||
avec ncurses
SANS la MACRO_QUI_VA_BIEN, le dossier Téléchargements n'est pas toujours aligné correctement.
Image

AVEC la MACRO_QUI_VA_BIEN, le dossier Téléchargements est aligné correctement dans tous les cas.
Image