IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

comment trouver la valeur ASCII d'un caractere tel que ô


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut comment trouver la valeur ASCII d'un caractere tel que ô
    j'essaye de transcrire un caractere en valeur ASCII, mais le %i ne donne acces qu'au valeurs ASCII comprises entre 1 et 127, or j'ai aussi besoin des valeurs ASCII étendues....
    Pour essayer de contourner le probleme j'ai écrit sur un fichier une table ASCII étendue et je recherche sur l'ensemble des caracteres ceux qui correspondent, par exemple:

    j'écris "salut c'est môa"
    et je veux 115, 97, 108....
    mais lors de ma recherche j'utilise getc qui ne manipule que des int et pas des char

    merci de m'aidser

  2. #2
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    ça cela ne te va pas ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main(int argc, char* argv[])
    {
    	FILE *h_file = fopen("toto.txt","rt");
    	int iChar = getc(h_file);
    	fclose(h_file);
    	printf("as int[%u]\n",iChar);
     
    	return 0;
    }
    dans toto.txt il y a : ô
    etla sortie ecran donne:
    as int[244]

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: comment trouver la valeur ASCII d'un caractere tel que ô
    Citation Envoyé par gronaze
    j'essaye de transcrire un caractere en valeur ASCII, mais le %i ne donne acces qu'au valeurs ASCII comprises entre 1 et 127, or j'ai aussi besoin des valeurs ASCII étendues....
    Le problème est qu'il y a plusieurs jeux de caractères étendus. Pour simplifier : OEM et ANSI, par exemple. Mais il y en a d'autres...

    Essaye ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    #include <stdio.h>
     
    #define N 8
     
    int main (void)
    {
       int i = 128;
     
       while (i < 256)
       {
          if ((i % N) != 0)
          {
             printf (" ");
          }
     
          printf ("%3d='%c'", i, i);
     
          i++;
     
          if ((i % N) == 0)
          {
             printf ("\n");
          }
       }
       return 0;
    }

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    j'essaye de transcrire un caractere en valeur ASCII, mais le %i ne donne acces qu'au valeurs ASCII comprises entre 1 et 127, or j'ai aussi besoin des valeurs ASCII étendues....
    Ce que tu veux, en fait, c'est simplement afficher les valeurs des octets qui composent ta chaîne.
    (L'ASCII étendu ça veut pas dire grand chose)

    Pour cela, il faut utiliser des unsigned char et non des char qui peuvent être signés.

    En utf-8 on obtient que ô est la séquence 195, 180.
    En ISO-8859-1, ISO-8859-15 ou windows-1252 ça donne bien 244 comme il a été dit précedemment.
    En IBM850 (utilisé par le terminal windows, du moins avec une version française) c'est 147.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Et comme l'unicode commence par l'ISO-8859-1, la valeur du ' ô ' en unicode est 244 aussi.
    On peut voir ça avec les wchar_t, qui servent à représenter les caratcères unicodes: sous Windows, ce sont des nombres 16bits, les caractères étant codés en UTF-16 (L'endianness doit être celle de la machine: sur un PC, c'est de l'UTF-16-LE)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Et comme l'unicode commence par l'ISO-8859-1, la valeur du ' ô ' en unicode est 244 aussi.
    Unicode est seulement un jeu de caractères, pas un encodage de caractères.
    Il y a tout un tas d'encodages de caractères pour unicode.

    On peut voir ça avec les wchar_t, qui servent à représenter les caratcères unicodes
    Non, ils servent à représenter des caractères "larges".
    Cela est indépendant d'Unicode, même si ces conteneurs sont souvent utilisés pour des implémentations d'encodages d'Unicode.

    sous Windows, ce sont des nombres 16bits, les caractères étant codés en UTF-16
    Pas en UTF-16, en UCS-2.
    Ça se ressemble beaucoup, sauf que UCS-2 ne supporte pas tout Unicode mais seulement les 65 536 premiers caractères. UTF-16 peut en supporter plus en utilisant deux nombres de 16 bits pour un caractère.
    (Unicode c'est 1 114 112 caractères)

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par loufoque
    (Unicode c'est 1 114 112 caractères)
    Including Klingon !

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    C'est pas un truc de Star Trek ça ?

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par loufoque
    C'est pas un truc de Star Trek ça ?
    Si, bien sûr !

    Trekker powa.

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par loufoque
    Unicode est seulement un jeu de caractères, pas un encodage de caractères.
    Il y a tout un tas d'encodages de caractères pour unicode.
    Ce que je voulais dire, c'est que je me souviens avoir lu que les 256 premiers caractères du jeu de caratères unicode sont les caractères de l'ISO-8859-1

    Non, ils servent à représenter des caractères "larges".
    Cela est indépendant d'Unicode, même si ces conteneurs sont souvent utilisés pour des implémentations d'encodages d'Unicode.
    Au temps pour moi...

    Pas en UTF-16, en UCS-2.
    Ça se ressemble beaucoup, sauf que UCS-2 ne supporte pas tout Unicode mais seulement les 65 536 premiers caractères. UTF-16 peut en supporter plus en utilisant deux nombres de 16 bits pour un caractère.
    (Unicode c'est 1 114 112 caractères)
    Tu es sûr ? Il me semble bien que Windows supporte cela également (c'es t bien cela qu'on appelle les "surrogate pairs" ?)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    c'es t bien cela qu'on appelle les "surrogate pairs" ?
    Oui.

    Moi j'ai vu beaucoup de code avec des chaînes de caractères de type wchar_t* qui partaient du principe qu'un wchar_t était un caractère.
    Après peut-être que l'api win32 a tout de même quelques fonctions qui les gèrent. Quoiqu'il en soit, si c'est le cas l'utilisation des caractères larges n'est pas appropriée, car d'après la norme les caractères larges doivent être suffisamment grand pour contenir n'importe quel caractère supporté par le système.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut
    merci pour les reponses, mais ça ne correspond pas vraiment a ce que je veux.
    voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include<stdio.h>
    #include<math.h>
    #include<string.h>
     
     
    void main()
    {
    	int i, j, longueur = 0;
    	unsigned char phrase[400];
    	unsigned char temp;
     
    	for(i=0;i<400;i++)
    	{
    		phrase[i] = NULL;
    	}
    	printf("rentrer le texte à transformer en ASCII\n");
    	gets(phrase);
     
    	longueur = strlen(phrase);
     
    	for(i=0;i<longueur;i++)
    	{
    		printf("tu as rentré en %d: %u\n", i, phrase[i]);
    	}
    }
    Voila ce qu'il me faut mais même en unsigned char je n'ai pas vraiment ce que je veux

  13. #13
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gronaze
    voici mon code:
    Commentaires et corrections...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #include<stdio.h>
    #include<math.h>
    #include<string.h>
     
    /* -ed-
    void main()
    */
    int main (void)
    {
       int i /* , j*/ , longueur = 0;
       /* -ed-
        unsigned char phrase[400];
     
          le bon type pour les chaines de caracteres est char.
       */
       char phrase[400];
       /* -ed-
       unsigned char temp;
     
       non utilisee
       */
       for (i = 0;i < 400;i++)
       {
          /* -ed-
            phrase[i] = NULL;
     
             NULL est un pointeur. Tu veux sans doutes dire 0.
             Mais il suffisait de definir le tableau comme suit :
     
           char phrase[400] = {0};
     
             bien que qu'il ne soit pas pas indispensable d'initialiser
             cette variable...
          */
       }
       printf("rentrer le texte à transformer en ASCII\n");
       /* -ed-
        gets(phrase);
     
          DANGER
     
       <a href="http://emmanuel-delahaye.developpez.com/notes.htm" target="_blank">http://emmanuel-delahaye.developpez.com/notes.htm</a>
       <a href="http://emmanuel-delahaye.developpez.com/notes.htm" target="_blank">http://emmanuel-delahaye.developpez.com/notes.htm</a>
     
       */
       fgets(phrase, sizeof phrase, stdin);
     
       longueur = strlen(phrase);
     
       for (i = 0;i < longueur;i++)
       {
          /* -ed-
     
            printf("tu as rentré en %d: %u\n", i, phrase[i]);
             pourquoi unsigned ? Le type par defaut est int, donc '%d'.
             
             par contre, pour que la valeur soit correcte, le char doit etre 
             converti en unsigned char.
          */
          printf("tu as rentré en %d: %d\n", i, (unsigned char) phrase[i]);
       }
     
       /* -ed- parce que main() retourne un int... */
       return 0;
    }

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut
    Merci Emmanuel, pour ces corrections.

    Sais tu quelle est la norme utilisée??

  15. #15
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gronaze
    Sais tu quelle est la norme utilisée??
    Norme de quoi ?

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut
    ce que je veux savoir c'est quel jeu de caracteres est utilisé: ISO xx, UTF, ...
    et si possible avoir une table de correspondance caractere->valeur ASCII, meme si je peux la retrouver en effectuant toute les valeurs entre 128 et 255

  17. #17
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gronaze
    ce que je veux savoir c'est quel jeu de caracteres est utilisé: ISO xx, UTF, ...
    et si possible avoir une table de correspondance caractere->valeur ASCII, meme si je peux la retrouver en effectuant toute les valeurs entre 128 et 255
    Question de système. Le C n'a rien à voir là dedans. Et pour simplifier, sous Windows, c'est pas le même charset en GUI et en console...

    Si tu arrives à comprendre ce fichier, tu as tout :

    http://emmanuel-delahaye.developpez....d/inc/ansi.itm

  18. #18
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    et si possible avoir une table de correspondance caractere->valeur ASCII, meme si je peux la retrouver en effectuant toute les valeurs entre 128 et 255
    ASCII définit 128 caractères, de 0 à 127.
    Tous les charsets que j'ai cités englobent ASCII. (En fait, à part EBCDIC, il doit pas y avoir beaucoup de charsets non compatibles avec ASCII)

    À partir de 128, ce n'est plus ASCII.
    Si tu veux plus d'infos, parcoure wikipédia.
    Tu y trouveras sûrement des tables et des informations sur certains charsets.

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Par défaut
    merci pour tout ces precieux conseils

  20. #20
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Si tu arrives à comprendre ce fichier, tu as tout :

    http://emmanuel-delahaye.developpez....d/inc/ansi.itm

    Euh... Pourquoi tu n'as qu'une seule colonne pour ANSI et OEM ?
    (Et visiblement, elle a l'air numérotée en "ANSI", qui doit être (je suppose) ISO-8859-1).

    Pour les charsets:
    Fenetres et fichiers Windows: Généralement, le charset utilisé est Windows-1252 (CP1252), qui est très proche de l'ISO-8859-1 (Windows a certains caractères imprimables supplémentaires là où l'ISO a des caractères de contrôle).
    Consoles Windows: Le charset habituel en France est IBM-850 (CP850), appelé OEM dans les fonctions de l'API Windows (CharToOem(), SetFileApisToOem(), etc.). Il ressemble à ce que Wikipédia appelle CP437 (OEM-US), mais les caractères graphiques "intersections possibles entre \"un seul trait\" et \"deux traits\"" sont remplacés par des lettres accentuées.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/07/2011, 12h16
  2. Comment trouver une valeur dans un tableau ?
    Par wizou44 dans le forum Excel
    Réponses: 20
    Dernier message: 29/08/2008, 10h57
  3. Comment récuperer la valeur ASCII d'un caractère ?
    Par El-Diablo- dans le forum C++Builder
    Réponses: 9
    Dernier message: 05/03/2007, 18h11
  4. Comment trouver les valeurs manquante d'une série ?
    Par NicoNGRI dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/10/2006, 09h38
  5. Réponses: 1
    Dernier message: 26/08/2006, 09h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo