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 :

Code ASCII et manipulation des caractères


Sujet :

C++

  1. #41
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 661
    Points : 410
    Points
    410
    Par défaut
    Merci pour ton intervention aussi rapide.
    Ton texte traité donne:
    àâAbcdéèêÉfghù

    �a�aabcd�e�e�e�efgh�u
    Pourquoi il y a t il des � � ?
    j'ai essayé de mettre les caractères dans un string et afficher qu'une partie du String, mais je ne trouve pas. Suis je sur la bonne voix ?
    Merci.
    Deplus j'ai parfois des [] ???

  2. #42
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 599
    Points : 1 348
    Points
    1 348
    Par défaut
    La moindre des choses est de montrer ce que t'affiche la compilation ou l'exécution du code de mon précédent message.
    Est-ce que tu les lis d'abord ???
    Je te rappelle la procédure: sur Eclipse, tu sélectionnes ton code source, ensuite sur la barre de menu, tu cliques Edit -> Set encoding... -> Cp1252

  3. #43
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 639
    Points : 10 593
    Points
    10 593
    Par défaut
    Voici 1 petit code (1 peu long ) qui manipule des caractères UTF-8 et qui fait ce que tu veux

    Attention : Sous Linux la console est en UTF-8. Sous Windows est en code page OEM et est passée en UTF-8 récemment (2019 - 2020) en théorie (CHCP 65001 sinon)


    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
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int main()
    {
        FILE* f = NULL;
        int c; size_t n, nb_chars;
     
        unsigned char buffer[] = {0XC3, 0XA0, 0X62, 0X63, 0X64, 0XC3, 0XA9, 0X66, 0X67, 0X68, 0XC3, 0XB9};
        unsigned char buffer_input[15];
     
    //  Step 1: write
        f = fopen("file.txt","wb");
        if (!f) {
            printf("main - error : fopen 1\n");
            return EXIT_FAILURE;
        }
        fwrite (buffer , sizeof(char), sizeof(buffer), f);
        fclose (f);
     
    //  Step 2: read and display
        f = fopen("file.txt","r");
        if (f == NULL) {
            printf("main - error : fopen 2\n");
            return EXIT_FAILURE;
        }
     
        n = 0; nb_chars = 0;
        c = fgetc(f);
        while (c != EOF) {
            printf("%c", c);
            buffer_input[n] = c;
            c = fgetc(f);
            ++n; // XXX Warning: overflow
        }
     
        printf("\n");
        nb_chars = n;
     
        fclose (f);
     
    //  Step 3: parse and display
        for(n = 0; n < nb_chars; ++n) {
            c = buffer_input[n];
     
            if (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))) {
                printf("%c", c);
            } else if (c == 0XC3) {
                ++n;
                c = buffer_input[n];
                switch(c) {
                case 0XA0:  printf("a"); break;
                case 0XA9:  printf("e"); break;
                case 0XB9:  printf("u"); break;
                }
            }
        }
     
        printf("\n");
     
     
        return EXIT_SUCCESS;
    }

  4. #44
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 661
    Points : 410
    Points
    410
    Par défaut
    Merci à Kaitlin et Foetus.
    Kaitlin bien sur j'analyse ton code et en console il n'y a pas d'erreur. Il y a juste ton résultat.
    Foetus ton code fonctionne nickel et vais le relire et l'étudier.

    Merci à vous deux.

  5. #45
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 661
    Points : 410
    Points
    410
    Par défaut
    Citation Envoyé par kaitlyn Voir le message
    Le fichier doit être enregistré au format Windows 1252, au pire enregistre-le avec notepad, encodage ANSI.
    I faut t'inspirer des codes que l'on te fournit. Si tu persistes avec genre des do {} while {caractere != EOF} ça ne va pas le faire, dans cet exemple, ton test sur EOF, en plus d'être erroné, arrive beaucoup trop tard.
    OK le do while a été retiré.



    Je propose cela mais il m'affiche que des 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
    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
    #include <cstdio>
    #include <cstdlib>
    #include <vector>
    #include <string>
    #include <iostream>
    using namespace std;
    int main() {
    
    char caractereMinuscule, caractere;
    int ascii_code;
    
    
    FILE* fic = fopen("src/presses/texttest.txt","r");
    if ( ! fic)
            return EXIT_FAILURE;
    
    while ((ascii_code=fgetc(fic))!= EOF) {
    
    		caractere = static_cast<unsigned char>(ascii_code);
    
    	 if (ascii_code==0XC3) {
    		 fseek(fic,1, SEEK_CUR); // avance le curseur sur le caractère suivant
    	 }
    
    	 if (ascii_code >= static_cast<unsigned char>(0xE0) && ascii_code <= static_cast<unsigned char>(0xE5))
    	 {caractere= 'a';}
    	 else if (ascii_code >= static_cast<unsigned char>(0xC0) && ascii_code <= static_cast<unsigned char>(0xC5))
    		 {caractere= 'a';}
    	 else if (ascii_code == static_cast<unsigned char>(0xC7) || ascii_code == static_cast<unsigned char>(0xE7))
    		 caractere= 'c';
    	 else if (ascii_code >= static_cast<unsigned char>(0xE8) && ascii_code <= static_cast<unsigned char>(0xEB))
    		 {caractere= 'e';}
    	 else if (ascii_code >= static_cast<unsigned char>(0xC8) && ascii_code <= static_cast<unsigned char>(0xC8))
    		 {caractere= 'e';}
    	 else if (ascii_code >= static_cast<unsigned char>(0xEC) && ascii_code <= static_cast<unsigned char>(0xEF))
    		 caractere= 'i';
    	 else if (ascii_code >= static_cast<unsigned char>(0xCC) && ascii_code <= static_cast<unsigned char>(0xCF))
    		 caractere= 'i';
    	 else if (ascii_code >= static_cast<unsigned char>(0xD2) && ascii_code <= static_cast<unsigned char>(0xD6))
    		 caractere= 'o';
    	 else if (ascii_code >= static_cast<unsigned char>(0xF2) && ascii_code <= static_cast<unsigned char>(0xF6))
    		 caractere= 'o';
    	 else if (ascii_code >= static_cast<unsigned char>(0xF9) && ascii_code <= static_cast<unsigned char>(0xFC))
    		 caractere= 'u';
    	 else if (ascii_code >= static_cast<unsigned char>(0xD9) && ascii_code <= static_cast<unsigned char>(0xDC))
    		 caractere= 'u';
    if (ascii_code>='A' && ascii_code<='Z') {
    	caractereMinuscule = caractere + 32;
    // cout<<caractMinuscule;
    caractere = caractereMinuscule;
     cout<<caractere;
     }
    else {cout<<caractere;}
    };
    printf("\n");
    fclose (fic);
    
    return 0;
    }
    AZERTY

    àâAbcdéèêÉfghù
    donne
    azerty

    aaabcdaaaafgha

  6. #46
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 639
    Points : 10 593
    Points
    10 593
    Par défaut
    Ton problème vient de ce test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	 else if (ascii_code >= static_cast<unsigned char>(0xC0) && ascii_code <= static_cast<unsigned char>(0xC5))
    		 {caractere= 'a';}
    • à: C3 A0
    • â: C3 A2
    • é: C3 A9
    • è: C3 A8
    • ê: C3 AA
    • É: C3 89
    • ù: C3 B9

    Tous tes caractères accentués commencent par 0xC3.

    Comme je te l'ai déjà dit, le traitement UTF-8 est assez pénible
    1. lire 1 octet
    2. déterminer s'il est valide et déterminer le nombre d'octets (nb_bytes) pour ce caractère
    3. lire (nb_bytes - 1) octets
    4. éventuellement valider si c'est 1 code UTF-8 valide et si c'est 1 caractère valide
    5. faire le traitement


    Et tu peux utiliser 1 outil de conversion pour t'aider comme r12a

  7. #47
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 599
    Points : 1 348
    Points
    1 348
    Par défaut
    Citation Envoyé par foetus Voir le message
    Ton problème vient de ce test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	 else if (ascii_code >= static_cast<unsigned char>(0xC0) && ascii_code <= static_cast<unsigned char>(0xC5))
    		 {caractere= 'a';}
    Salut toi,

    Non, c'est les A majuscules diacrités de la table Windows 1252, de C0 à C5... ENFIN !!!
    Par contre les casts ici sont inutiles, les opérandes étant de même type, des if (ascii_code >= 0xC0 && ... suffisent.

  8. #48
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 661
    Points : 410
    Points
    410
    Par défaut
    J'ai essayé pas mal de représentation. UTF, ISO, 1252 ect
    avec hexa puis décimal 'charactère' 'A' à ect ...
    Bref il ne manque plus que la bonne table.
    Pour l'instant il n'affiche que des 'a'

    AZERTY

    àbcdéfghù

    -----------------------------------
    azerty

    abcdafgha
    En utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     if (ascii_code >= (131) && ascii_code <= (134))
    	 {caractere= 'a';}
    	 else if (ascii_code >= (142) && ascii_code <= (143))
    		 {caractere= 'a';}
    	 else if (ascii_code == (0xC7) || ascii_code == (0xE7))
    		 caractere= 'c';
    	 else if (ascii_code >= (136) && ascii_code <= (138))
    		 {caractere= 'e';}
    On obtient
    azerty

    �bcd�fgh�
    J'utilise assci étendue.
    Est ce la bonne voix ?

  9. #49
    Membre expérimenté
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 599
    Points : 1 348
    Points
    1 348
    Par défaut
    Lorsque tu écris tes ascii_code >= à des nombres, ces nombres là tu les récupères bien dans une table. Mais si le fichier que tu lis n'est pas encodé dans cette table, ton programme n'affichera pas le résultat attendu. Tu dois choisir une table et t'y tenir.

  10. #50
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 661
    Points : 410
    Points
    410
    Par défaut
    Merci pour l éclairage.

  11. #51
    Membre habitué
    Homme Profil pro
    libre
    Inscrit en
    Mai 2024
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Mai 2024
    Messages : 74
    Points : 131
    Points
    131
    Par défaut
    Voila une table utf8 pour les caractères allant de À (192) jusque le char 255.
    un autre défit surgit c'est qu'il faut décomposer certains caractères comme œ et æ

    Nom : Utf8.png
Affichages : 42
Taille : 14,6 Ko

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/12/2010, 02h27
  2. Codes ASCII des fleches directionelles?
    Par H-raf dans le forum C
    Réponses: 15
    Dernier message: 30/05/2008, 10h28
  3. Convertir des codes ASCII en lettres
    Par grigri dans le forum Pascal
    Réponses: 4
    Dernier message: 14/04/2006, 11h54
  4. transcoder des codes ascii en caractères
    Par gillou026 dans le forum Langage
    Réponses: 6
    Dernier message: 06/03/2006, 09h25
  5. chaîne à partir des codes ascii
    Par parsy dans le forum Langage
    Réponses: 2
    Dernier message: 05/08/2005, 22h19

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