Code ascii étendu

bonjour,
j’aimerais pouvoir afficher dans ma console un caractère rectangulaire dont le code ascii étendu en décimal est 177.
J’utilise (en C), l’instruction printf("%c\n",177) mais le programme affiche un point d’interrogation.
Je suppose que %c ne concerne que les caractères ascii de base …
Merci pour votre aide

Dans quel codepage ? :mrgreen:

N’oublie pas non plus que ta console utilise plus que probablement de l’UTF-8 :

$ echo $LANG

La commande echo $LANG me donne :
FR_FR.UTF-8

j’ai regardé le tableau des caractère utf8 et j’ai vu que le 233 correspond normalement au é (e accent aigu).
Or mon programme ne m’affiche rien avec l’instruction : printf("%c\n",233)
J’ai fait d’autres essais mais ça ne donne rien.
Est-ce le %c qui pose problème ?

Merci

Un caractère UTF-8 c’est composé de plusieurs octets dès que tu sors de l’ASCII (>127 quoi, voir fr.wikipedia.org/wiki/UTF-8 qui n’est qu’un codage particulier de l’unicode). Le langage C ne gère pas ça nativement : pour lui 1 caractère = 1 octet.

Le plus simple serait probablement :

  • soit de taper (ou copier coller) le caractère directement (si tu édites ton fichier en UTF-8) mais pour les trucs exotiques comme le carré dont tu parles vaut mieux éviter
  • soit tu retrouves le caractère en question dans le jeu unicode, tu convertis son code-point unicode en séquence d’octets UTF-8 et tu mets ça dans une chaîne littérale en échappant les valeurs en hexa. Pour le “é” (qui a l’avantage d’être en exemple sur Wikipedia) la séquence est C3 A9 donc : printf(“s\xC3\xA9quence\n”);

Bref c’est pas super pratique, sinon après faut utiliser des outils d’i18n qui te permettent de charger des ressources externes (gettext, ICU, …) mais ça devient compliqué.

Salut
J’ai compris tes explications mais je galère.
J’ai trouvé sur une table unicode le code du caractère rectangulaire : 2588
voir

http://fr.wikipedia.org/wiki/Table_des_caract%C3%A8res_Unicode_%282000-2FFF%29

J’ai converti en utf8 , ce qui m’a donné D29688
Ensuite j’ai tapé l’instruction printf("\xD2\x96\x88") mais je n’ai pas le bon caractère.
J’ai vérifié plusieurs fois ma conversion donc je ne sais pas quoi faire …

Merci

[quote=“zerimbak”]'ai trouvé sur une table unicode le code du caractère rectangulaire : 2588
[…]
J’ai converti en utf8 , ce qui m’a donné D29688
Ensuite j’ai tapé l’instruction printf("\xD2\x96\x88") mais je n’ai pas le bon caractère.
J’ai vérifié plusieurs fois ma conversion donc je ne sais pas quoi faire …[/quote]
T’as dû oublier un bit quelque part… c’est E2 96 88 (copié-collé le U+2588 depuis Wikipedia dans un fichier texte, vérifié avec un éditeur hexa et en C avec printf).

En effet j’ai commis 3 fois la même erreur, j’ai pris un E pour un D.Mais je retiens ta méthode de conversion.
Par contre il y a un méthode moins pénible pour l’affichage.

j’ai fait :

char c[3]={226,150,136} ;
printf("%s",c) ;

Merci pour ton aide

[quote=“zerimbak”]Par contre il y a un méthode moins pénible pour l’affichage.

char c[3]={226,150,136} ; printf("%s",c) ; [/quote]
Effectivement, mais il te faut aussi un null à la fin sinon t’as un débordement (et pas besoin de spécifier la taille du tableau, il fait ça tout seul) :

Mais mon problème n’est pas tout à fait résolu :

En effet je souhaite utiliser la fonction printw de la lib ncurses pour afficher le caractère rectangulaire mais contrairement à ce que je pensais cette fonction ne parvient pas à afficher le caractère en question.
j’ai essayé printw("\xE2\x96\88") et printw("%s",c) avec c={226,150,136}
Mais là c’est la cata, ça m’affiche toute une série de caractères quelconques (une dizaine).
Je ne sais pas si je dois ouvrir un nouveau fil ou si tu peux m’aider ?

Merci

Pas besoin d’ouvrir un nouveau fil… par contre pour ncurses je passe la main je connais pas assez.

Cela dit, vu que t’utilises ncurses ça serait pas plus simple d’inverser les couleurs et afficher un espace ? :mrgreen:

Ok, je vais voir ça …
Concernant la conversion du code Unicode en hexa, quel éditeur hexa utilises-tu ?
Et avec la commande od est-ce possible ? Je n’y suis pas parvenu …
Merci

Okteta (programme KDE), pour ce que j’en fais ça me suffit largement.

Comme ça ?

[code]$ od -t x1 <<EOF

123
é
EOF
0000000 31 32 33 0a c3 a9 0a
0000010[/code]

J’ai essayé la commande od comme tu l’as fait sur ces exemple mais
j’aimerai avoir la traduction hexa de U+2588
Et pour l’instant ça ne me donne ce que je veux …

Copier le caractère à partir de la page Wikipedia en question (un jour faudra que je cherche l’équivalent de Alt+PavéNumérique sous Linux… c’est peut-être un des rares trucs où Windows se révèle un peu pratique).
Le coller dans la partie echo.

$ echo -n "█" | od -t x1 0000000 e2 96 88 0000003

Ok, ça marche !!
Il ne me reste plus qu’à régler le problème avec ncurses.
Merci