4 votes

Comment imprimer les caractères Unicode "tireurs de boîtes" en C (terminal Linux utf8) ?

J'essaie d'afficher les caractères Unicode de (Box Drawing Range : 2500-257F). C'est censé être la norme utf8 (The Unicode Standard, Version 6.2). Je suis tout simplement incapable de le faire.

J'ai d'abord essayé d'utiliser les bons vieux caractères ASCII mais le terminal Linux affiche en utf8 et il n'y a pas de conversion (symbole ?) affichée en place.

Quelqu'un peut-il répondre à ces questions ?

  • Comment encoder un caractère unicode dans une variable C ( style wchar_t ) ?
  • Comment utiliser la séquence d'échappement telle que 0x ou 0o (hex, oct) pour Unicode ?

Je connais U+ mais il semble que ça n'ait pas marché.

setlocale(LC_ALL,"");
short a = 0x2500, b = 0x2501;
wchar_t ac = a;
wchar_t bc = b;
wprintf(L"%c%c\n", ac, bc);
exit(0);

Je sais que les résultats sont liés à la police utilisée, mais j'utilise une police utf8 ( http://www.unicode.org/charts/fonts.html ) et les codes de 2500 à 257F doivent être affichés... En fait, ils ne le sont pas.

Merci d'avance pour votre aide...

[EDIT LATELY] Le problème est résolu depuis... et j'ai trouvé comment utiliser wprintf() avec %lc au lieu de %c... et plus profondément. Maintenant ces tiroirs d'arc font partie de ma bibliothèque d'"outils" d'étudiant pour rendre l'apprentissage de la programmation en console un peu plus coloré.

5voto

librin.so.1 Points 375

Utilisez une Cstring contenant les octets des versions utf-8 de ces caractères. Si vous imprimez cette Cstring, ce caractère sera imprimé.

exemple pour tes deux personnages :

#include <stdio.h>

int main (int argc, char *argv[])
{
    char block1[] = { 0xe2, 0x94, 0x80, '\0' };
    char block2[] = { 0xe2, 0x94, 0x81, '\0' };
    printf("%s%s\n", block1, block2);
    return 0;
}

imprime pour moi.

De même, si vous imprimez une chaîne C contenant des octets de caractères uft-8 quelque part dans celle-ci, elle imprimera ces caractères sans problème. /* en supposant que vous utilisez gcc */ Et IIRC gcc utilise utf-8 en interne de toute façon.

EDIT : Votre question a un peu changé pendant que j'écrivais ceci. Et ma réponse est moins pertinente maintenant. Mais d'après tes symptômes - si tu vois un ? pour chaque caractère que tu attends, je dirais que la police de ton terminal n'a peut-être pas les glyphes requis pour ces caractères.

0voto

nim Points 595

Cela dépend de ce que vous appelez "terminal".

La console linux utilise divers bidouillages pour afficher l'unicode mais en réalité sa police est limitée à 512 symboles IIRC donc elle ne peut pas vraiment afficher toute la gamme de l'unicode et ce qu'elle peut afficher dépend de la police chargée (cela peut changer dans le futur).

Les terminaux Windows utilisés pour accéder à Linux sont généralement endommagés d'une manière ou d'une autre au niveau de l'unicode.

Les terminaux physiques sont généralement moins bons et ne fonctionnent qu'en mode ascii.

Les terminaux GUI de Linux (tels que gnome-terminal) peuvent pratiquement tout afficher, à condition que vous disposiez des polices correspondantes.

Etes-vous sûr de ne pas vouloir utiliser ncurses au lieu d'écrire vos propres widgets de terminal ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X