Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/10/2008, à 11:49

djitar

Problème d'affichage de caractères de la table ASCII

Bonjour,

   A l'aide du code ci-dessous (écrit en C), j'aimerais afficher l'ensemble des caractères de la table ASCII.

   #include <stdio.h>
   int main ()
   {
       int i;
       for (i=0; i<256; i++)
           printf ("[%d, %c] ", i, i);
       return 1;
   }

   Le seul problème est que les caractères ne s'affichent pas correctement sous Linux (par contre sous windows ça passe !).
   Sous le terminal (Konsole), j'ai tenté de modifier le type d'encodage (en UTF8) mais en vain.

   Si qqun a une solution ou une idée, elle serait la bienvenue.

Merci

Hors ligne

#2 Le 22/10/2008, à 12:24

philou8237

Re : Problème d'affichage de caractères de la table ASCII

Un caractère ASCII est codé sur 7 bit, il y en a donc 128 et non 256.

les premiers caractères de la table ASCII (les 31 premiers si je me souviens bien) ne sont pas des caractères imprimables. Tu y retrouve entre autres '\0', '\r', '\n', etc... qui ont dût mettre un beau bordel dans ton affichage si tu as voulu les afficher à l'écran smile

Regarde bien le man de ascii pour voir quels sont les caractères imprimables.

Hors ligne

#3 Le 22/10/2008, à 12:26

®om

Re : Problème d'affichage de caractères de la table ASCII

L'encodage par défaut en UTF-8 (c'est l'encodage qui devrait être utilisé partout).
L'ASCII (jusqu'au numéro 127) est commun à tous les encodages.

Et les nombres de 128 à 256, ça ne veut rien dire en UTF-8 (ça passe sur 2 octets) : http://fr.wikipedia.org/wiki/UTF-8

Hors ligne

#4 Le 22/10/2008, à 12:41

tiky

Re : Problème d'affichage de caractères de la table ASCII

djitar a écrit :

Bonjour,

   A l'aide du code ci-dessous (écrit en C), j'aimerais afficher l'ensemble des caractères de la table ASCII.

   #include <stdio.h>
   int main ()
   {
       int i;
       for (i=0; i<256; i++)
           printf ("[%d, %c] ", i, i);
       return 1;
   }

   Le seul problème est que les caractères ne s'affichent pas correctement sous Linux (par contre sous windows ça passe !).
   Sous le terminal (Konsole), j'ai tenté de modifier le type d'encodage (en UTF8) mais en vain.

   Si qqun a une solution ou une idée, elle serait la bienvenue.

Merci

Bonjour,

Chez moi il affiche correctement la table ASCII. Les caractères de cette table sont codés sur 7 bits, par conséquent le dernière caractère ASCII est donné par le nombre décimal 127. Tout les caractères de cette table ne sont pas affichables. Tout les caractères au-delà ne sont pas de la table ASCII.
http://fr.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange

Sous DOS, l'encodage du terminal utilisé la page de code 850. Une extension de l'ASCII qui utilise le bit de poids fort de l'octet pour ajouter 128 caractères spécifiques.
http://fr.wikipedia.org/wiki/Page_de_code_850

Pour connaître l'encodage dans le terminal, tape:

locale

Note: il faut que l'encodage du terminal et celui de ton éditeur correspondent.

Chez moi c'est UTF-8:
http://fr.wikipedia.org/wiki/Utf-8

Comme tu peux le voir, l'UTF-8 utilise soit 1, 2, 3 ou 4 octets pour coder les caractères. Lorsqu'il s'agit d'un octet, le bit de poids fort est à 0. l'UTF-8 se comporte alors comme la table ASCII. Ça permet la compatibilité avec les anciens logiciels. Et c'est pour ça que l'affiche est incohérent sous Linux car le terminal attend un second octet si le premier commence par 110 et ce second octet doit impérativement commencer par un 10.

Autre remarque:
Ton programme retourne 1. Un programme doit retourner 0 lorsqu'il se déroule correctement.

Dernière modification par tiky (Le 22/10/2008, à 14:01)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#5 Le 22/10/2008, à 12:50

tiky

Re : Problème d'affichage de caractères de la table ASCII

#include <stdio.h>
int main( void )
{
    char i = 0xC3;
    char j = 0xA9;
    printf("%c%c", i, j );
    return 0;
}

Affiche é dans un terminal en UTF-8. 2 octets sont nécessaires.


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#6 Le 22/10/2008, à 13:14

djitar

Re : Problème d'affichage de caractères de la table ASCII

Salut,

   Tout d'abord merci à tous pour vos réponses. Au fait quand j'ai parlé de ASCII, je sous entendais ASCII étendue (désolé pour le manque de précision). Sinon, si je comprend bien il n'est pas possible, sous un terminal Linux, d'afficher ces caractères supplémentaires ???

   Pour être plus clair, je désire afficher les caractères qui permettent de dessiner un tableau ( ┼, ├, ┬, etc ...). Leur code ASCII étant supérieur à 127, comment pourrai-je faire alors ?


   @tiky :
     1) Autant pour moi, l'affichage de la table ASCII passe bien mais pas les caractères imprimables.
     2) Bien entendu, le programme retourne 0 en cas de succès mais j'ai du faire un couper coller (le return 1 vient d'un autre bout de code)
     3) Le code que t'as posté, utilise de l'hexadécimal. Quel est son utilité ?

Merci.

Hors ligne

#7 Le 22/10/2008, à 13:25

®om

Re : Problème d'affichage de caractères de la table ASCII

djitar a écrit :

Pour être plus clair, je désire afficher les caractères qui permettent de dessiner un tableau ( ┼, ├, ┬, etc ...). Leur code ASCII étant supérieur à 127, comment pourrai-je faire alors ?

Quel encodage? IBM850?

Si oui, par exemple ┼  est le code C5 (197), et pour l'afficher dans une console utf-8 (où le même caractère ┼ correspond aux octets e294bc), il faut faire :

echo c5 | xxd -p -r | iconv -f ibm850 -t utf-8

smile

Mais préfère utiliser de l'utf8 qu'un encodage bidon (ascii "étendu").

Hors ligne

#8 Le 22/10/2008, à 13:44

tiky

Re : Problème d'affichage de caractères de la table ASCII

J'utilise de l'hexadécimal car c'est plus rapide à convertir en binaire que le décimal.

0xC3 = 1100 0011   ( 0xC = 1100 et 0x3 = 0011 )
0xA9 = 1010 1001   ( 0xA = 1010 et 0x9 = 1001 )

Comme tu peux le voir, on peut découper les bytes ( et plus particulièrement les octets ) en tranches de 4 bits pour les convertir en hexadécimal. On peut d'ailleurs faire la même chose pour l'octal en découpant en tranches de 3 bits.
Ça vient du fait que 8 et 16 sont des puissances de 2 alors que 10 non wink
Tiens je viens de remarque un truc amusant:

2^3 = 8 donc on regroupe par groupe de 3 en base 8
2^4 = 16 donc on regroupe par groupe de 4 en base 16
2^5 = 32 donc on regroupe par groupe de 5 en base 32 :p

Dernière modification par tiky (Le 22/10/2008, à 14:07)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#9 Le 22/10/2008, à 14:08

djitar

Re : Problème d'affichage de caractères de la table ASCII

Salut,

   Finalement ça marche. J'ai sélectionné comme type d'encodage IBM850 (Settings -> Encoding -> Western European (ibm850) pour info) dans le terminal "Konsole". Ensuite j'ai testé ce bout de code :

   #include <stdio.h>
   int main ()
   {
       printf (" - %c - %c - %c - %c -", 218, 194, 191, 195);
       
       return 0;
   }

    Et là l'affichage passe correctement. Merci à tous encore une fois pour vos réponses.

Hors ligne

#10 Le 22/10/2008, à 14:20

tiky

Re : Problème d'affichage de caractères de la table ASCII

djitar a écrit :

Salut,

   Finalement ça marche. J'ai sélectionné comme type d'encodage IBM850 (Settings -> Encoding -> Western European (ibm850) pour info) dans le terminal "Konsole". Ensuite j'ai testé ce bout de code :

   #include <stdio.h>
   int main ()
   {
       printf (" - %c - %c - %c - %c -", 218, 194, 191, 195);
       
       return 0;
   }

    Et là l'affichage passe correctement. Merci à tous encore une fois pour vos réponses.

Oui enfin ça sert un peu à rien...

Sinon j'ai vérifié ce que j'ai dit au-dessus ( qui sert aussi à rien ):
813 en décimal ça donne 11001 01101 en binaire. Donc on peut l'écrire en 2 chiffres en base 32 ce qui donne PD ( pas fait exprès ! ).


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#11 Le 22/10/2008, à 14:22

®om

Re : Problème d'affichage de caractères de la table ASCII

#include <stdio.h>
int main ()
{
    printf ("\u253c\n");
    
    return 0;
}

smile

Hors ligne