Forum Programmation.c Caractères imprimables qui passent pas

Posté par  .
Étiquettes :
0
30
mar.
2005
Bonjour,

Je dois faire un jolie cadre en C. Le problème c'est que mon système ne gère pas correctement les caractères (qui ne sont pas des caractère clavier).
exemple :

printf( "%c" , 196); // pour afficher un trait vertical
printf( "%c" , 217); // pour afficher un angle inférieur droit

A la place, sont affiché des caractère étrange (non imprimable?)..

Si vous avez une explication, et surtout si vous connaissez la façon pour résoudre ce problème : A VOS CLAVIERS!!!

PS: J'utilise une distribution GNU/Linux Slackware 10.1, le fonts utilisé est celui par défaut...

D'avance MARCHI!
  • # Hello !

    Posté par  . Évalué à 3.

    J'utilise quotidiennement ces caractères. Si l'affichage écran reste hasardeux, l'impression est - pourvu qu'on soit pourvue d'une imprimante digne de ce nom - d'une simplicité enfantine.
    Lorsque je dois imprimer de tels fichiers, je m'assure de tout balancer à l'imprimante en mode RAW, et je laisse le soin à celle-ci de digérer ce qu'elle reçoit moyennant quelques réglages sur son panneau de commande :
    L'orientation du papier en portrait ou paysage
    Le nombre de lignes par page respecivement 72 ou 66
    Le nombre de caractères par pouces : respectivement 10 ou 12
    La page de code utilisée : PC-850
    Tout le reste semble trivial et règle la mise en page et/ou l'impression recto-verso si l'imprimante le gère.
    Normalement, ça fonctionne.
    Si tu as des problèmes, j'avais trouvé comment procéder pour changer un bête fichier ascii avec ces caractères bizzares en un beau fichier ps ou pdf, mais je n'ai pas la commande sous la main.
    Si l'un d'entre vous l'a, fournissez-la, sinon, il faudra attendre demain.
    Voilà, en espérant t'avoir au moins un peu aidé.
  • # Bienvenue dans le monde merveilleux des charsets.

    Posté par  . Évalué à 5.

    Première chose, est-ce que tu travailles sous Linux ou sous DOS ?

    Réponse longue :

    Ensuite, étant donné qu'en ASCII standard le bit7 (celui de poids fort, de 0 à 7) est utilisé comme bit de parité pour les télétransmissions, seuls les 128 premiers caractères sont standard (et encore, les caractères de contrôle et le 127 ont tendance à être implémentés de différentes manières en fonction des plateformes).

    Ce qui veut dire qu'utiliser les caractères au dessus de 127 pour dessiner des cadres est une très mauvaise idée ! Du temps du DOS, tout le monde avait le même problème.

    Les caractères que tu recherches sont ceux définis par IBM pour son PC, en tant que jeu par défaut, et définis à la quatre-cent-trente-septième page de leurs spécifications. Donc sous DOS: C:\> chcp 437 ("Change CodePage"). A titre d'info, la page de code utilisée en Europe est la 850, et bon nombres des « angles » ont été remplacés par les caractères accentués.

    Maintenant, lorsque tu mets une carte graphique sous tension, comme elle est prévue pour gérer un mode texte (ne serait-ce que pour afficher l'état de l'autotest à l'allumage de ta machine), elle est livrée avec un jeu de caractères bitmap VGA standard, en général mappant celui d'IBM.

    Sous Linux, ensuite, tu as deux choix:

    Soit tu cherches à afficher ton programme en mode texte. Dans ce cas-là, il faut recharger un nouveau bitmap dans la carte graphique. Jette un oeil à ce qui se trouve dans /usr/lib/kbd/consolefonts et utilise setfont pour effectuer l'action en question, soit tu travailles sous X-Window et il faut demander au terminal d'utiliser une fonte fixe qui produit ces symboles.

    Eventuellement, tu peux générer un .ps à l'aide de a2ps pipé sur la sortie de ton programme. Avec les bonnes options, tu peux lui demander d'utiliser la cp437 pour faire son rendu. Ensuite il passera partout puisque c'est un fichier « graphique » ! Vois aussi du coté de recode.

    Tu peux aussi utiliser l'UTF-8 ou l'Unicode si tes périphs de sortie les reconnaissent.

    Réponse courte :

    Utilise comme tout le monde les "+","|" et "-" pour faire tes cadres. C'est pratiquement aussi propre et tu es alors sûr que ton programme fonctionnera sur tous les ordinateurs et terminaux du monde.
    • [^] # Re: Bienvenue dans le monde merveilleux des charsets.

      Posté par  . Évalué à 2.

      Merci!

      Comme je le dis dans mon poste je suis sous Linux.

      En fait je veux afficher mon programme dans une console et pas l'imprimer
      • [^] # Re: Bienvenue dans le monde merveilleux des charsets.

        Posté par  (site web personnel) . Évalué à 4.

        Le problème c'est que mon système ne gère pas correctement les caractères (qui ne sont pas des caractère clavier).

        Mais si il les gère très bien, c'est toi qui a beaucoup de choses à apprendre sur la gestion des caratères, tu es resté au moins dix ans en arrière.

        Avec les réglages par défaut de Slackware (qui sont ceux de la plupart des distributions Linux, sauf celles qui sont intégralement en UTF-8) :

        printf("%c", 196); // ça doit t'afficher un A majuscule tréma
        printf("%c", 217); // ça doit t'afficher un U majuscule grave

        La liste des caractères est ici :
        http://czyborra.com/charsets/iso8859.html#ISO-8859-1(...)

        En fait je veux afficher mon programme dans une console et pas l'imprimer

        Utilise ncurses pour tracer des lignes et des rectangles, et autres fenêtres et menus en mode texte. Ah oui, c'est pas une partie de plaisir d'après ce qu'on m'a dit.
  • # ncurses ??

    Posté par  . Évalué à 3.

    Les caractères que tu souhaites utiliser ne sont pas forcément disponibles dans l'encodage que tu utilises.

    Peut-être ferais-tu mieux d'utiliser la bibliothèque ncurses ?
  • # cadre.c

    Posté par  . Évalué à 3.

    pour faire du travail propre, il vaut mieux utliser ncurses, un peu comme ça :

    #include <ncurses.h>

    main ( int argc, char **argv )
    {
    initscr();
    box(stdscr,0,0);
    move(1,30);
    printw("Bonjour tout le monde !");
    refresh();
    getch();
    endwin();
    }

    compile avec -lncurses.
    • [^] # Re: cadre.c

      Posté par  . Évalué à 2.

      Je te pertinente, mais j'ai quand même quelques petits problèmes avec ton programme.

      Tout d'abord, les deux bonnes manières de déclarer la fonction main sont :
      int main(int argc, char** argv)
      ou
      int main(void)
      Mais sûrement aps void main() ni main(int argc, char** argv) ...

      De plus, il manque un 'return 0;' à la fin de la fonction.

      Mais bon, je pinaille ...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.