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

Autres projets et contributions
avi3000
Chu Ko Nu
Messages : 309
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

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

Message par avi3000 » jeu. 08 juin 2017, 20:42

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
Dernière édition par avi3000 le ven. 09 juin 2017, 10:21, édité 1 fois.

Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 15002
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

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

Message par benjarobin » jeu. 08 juin 2017, 20:49

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 ?
Zsh | KDE | PC fixe : core i7, carte nvidia | Portable : Asus ul80vt
Titre d'un sujet : [Thème] Sujet (état)

avi3000
Chu Ko Nu
Messages : 309
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

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

Message par avi3000 » jeu. 08 juin 2017, 20:56

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.

Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 15002
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

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

Message par benjarobin » jeu. 08 juin 2017, 21:00

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...
Zsh | KDE | PC fixe : core i7, carte nvidia | Portable : Asus ul80vt
Titre d'un sujet : [Thème] Sujet (état)

avi3000
Chu Ko Nu
Messages : 309
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

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

Message par avi3000 » jeu. 08 juin 2017, 21:59

Je n'ai pas trouvé de version unicode pour scandir et dirent.

Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 15002
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

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

Message par benjarobin » jeu. 08 juin 2017, 22:06

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
Zsh | KDE | PC fixe : core i7, carte nvidia | Portable : Asus ul80vt
Titre d'un sujet : [Thème] Sujet (état)

avi3000
Chu Ko Nu
Messages : 309
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

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

Message par avi3000 » jeu. 08 juin 2017, 22:51

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.

avi3000
Chu Ko Nu
Messages : 309
Inscription : dim. 19 juin 2011, 18:53
Localisation : dans le neuf trois

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

Message par avi3000 » ven. 09 juin 2017, 10:21

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
Dernière édition par benjarobin le ven. 09 juin 2017, 12:02, édité 1 fois.
Raison : Utilise les bonnes balises de code, stp

Répondre