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 :

desaccentuer les caractères


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Points : 92
    Points
    92
    Par défaut desaccentuer les caractères
    bonjour a tous
    je dois faire un exercice pour l'école
    et j'ai un souci
    je crée un string avec des accent et je devrais la transformer en lettre sans accent
    j'ai fais un bout de code mais le code asscii retournée ne correspond pas aucode assci reel donc il ne passe pas dans mon switch pour faire la modification du caracrère
    je vous montre mon code enfin une partie car avant le switch j'essaye de voir d'ou viens l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       string supprAccent(string chaine)
     {
    	int i;
    	int entier ;
    	int nbre = chaine.length();
    	for(i=0;i<=nbre-1;i++)
    	{
    		entier = static_cast <int>(chaine [i]);
    		cout << chaine[i] << " corespondance ASCII " << entier  << endl;
    et dans le main je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	string chaine;
     
    	cout << "Veuillez inserer ne phrase avec des accent ";
    	cin >> chaine ;
     
    	chaine = supprAccent(chaine);
    et quand je visualise la reponse si je met pas d'accent le code asscii correspond mais aussitôt que je met des accent il me donne des reponse bizarre
    exemple:
    a correpond a 97
    b correspond 98
    tous ok mais
    é corespond a -126
    à correspond a -123

    si vous pourriez me dire d'ouviens l'erreur je vous en remercie

    Di Blasio Michael

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par diblasio Voir le message
    é corespond a -126
    à correspond a -123
    Cela sent le signed char.

    En général, les accents et caractères spéciaux ont des codes supérieurs à 127.

    Un nombre plus grand que 128 mis dans un signed char sera un interprété comme un nombre négatif. Essaye de lire dans des unsigned char.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Points : 92
    Points
    92
    Par défaut
    ok je vais essayer cela
    car s'est vrai pour les caractère accentuer en que l'on utlisise chez nous en eupope il vont de 128 a 154
    donc meme si je les mais on non signer il me donne pas le bon nombre decimal
    car si je prend le é il devrais me retouner le code asscii decimal 130
    mais a moi il me retourne -126
    je vais voir si je le mais en unsigned comme tu dis si il me retourne 126 ou le 130 qui correspond au vrai code ascii
    merci pour ta repnse aussi rapide

  4. #4
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    La question n'est-elle pas plutôt de savoir comment sont représentés et comment peuvent être récupérés les caractères accentués dans une string ?

    Comparer par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
      string essai;
      essai = "de";
      cout << essai[1] << endl;
    }
    qui donne :
    e
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
      string essai;
      essai = "dé";
      cout << essai[1] << endl;
    }
    qui... ne donne rien...

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Là le problème est du à la sortie .
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Suivant la suggestion de ram-0000, ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
      unsigned char c;
      string essai = "dé";
      c = static_cast<unsigned char>(essai[1]);
      cout << c << endl;
      c = essai[1];
      cout	 << c << endl;
    }
    Ne donne rien non plus.
    Comment fait-on au bout du compte pour obtenir le code ASCII d'un caractère accentué ou autre caractère au-dessus de 127 à partir d'une string d'une part et comment fait-on pour l'obtenir isolément en sortie d'autre part ?

  7. #7
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Je me répète ... c'est ta console qui ne gère pas les caractères accentuées avant tout ...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  8. #8
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Ma console gère parfaitement les caractères accentués en règle générale.
    Elle les traite parfaitement par exemple sous le shell Bash de Linux.
    D'autre part elle affiche parfaitement la chaîne elle-même :
    un donnera un

    parfait dans les exemples précédents. Ce qui pose problème c'est spécifiquement ;

    La question est surtout : quelle est la solution finalement pour ces deux problèmes ?
    J'ai tenté aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
      wchar_t c;
      string essai = "dé";
      c = static_cast<wchar_t>(essai[1]);
      cout << c << endl;
      c = essai[1];
      cout	 << c << endl;
    }
    pas mieux, cela donne
    -61
    -61

    EDIT :
    Pour afficher un unique caractère accentué d'une chaîne une solution tortueuse consiste à appeler substr(), ceci marche par exemple très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main()
    {
      string s = "délicat";
       cout << s.substr(1,2);
    }
    j'obtiens correctement
    é
    en sortie.
    Reste la question posée initialement ; comment afficher/obtenir le code ASCII de ce 'é' (comment obtenir le code ASCII d'un caractère 'spécial' occupant une certaine position dans une chaîne) ?

  9. #9
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Pas la peine de t'embêter, la table ASCII ne contient pas de caractères accentués, ni de valeur au dessus de 127.

    De plus, ton système ne semble pas utiliser l'ASCII mais l'UTF-8 pour encoder les caractères. Ce qui complexifie ton problème car en UTF-8 les caractères accentués sont codés sur plusieurs octets (d'où le substr(1, 2)).

  10. #10
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Il s'agit du code ASCII étendu, évidemment.
    UTF-8 reprend strictement le codage ASCII pour les caractères jusqu'à 127.
    UTF-8 est utilisé maintenant par les Unix et par Windows si je ne me trompe ? Pas seulement par "mon système"...

    Ton "d'où" me laisse perplexe par ailleurs... le second argument de substr() représentant une position de la chaine d'origine qui ne fera pas partie de la chaine extraite. substr(n,n+1) renvoie une chaine à 1 seul caractère, en principe.

    Je ne cherchais pas à m'embêter, juste à résoudre le problème de l'auteur du fil... il est vrai qu'il semble avoir disparu entretemps..

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par ptyxs Voir le message
    Il s'agit du code ASCII étendu, évidemment.
    UTF-8 reprend strictement le codage ASCII pour les caractères jusqu'à 127.
    UTF-8 est utilisé maintenant par les Unix et par Windows si je ne me trompe ? Pas seulement par "mon système"...
    UTF-8 est utilisé par certains configs de systèmes Unix ou Linux, et n'est pas utilisé sous Windows (dont la console est toujours en IBM-850 en France)
    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.

  12. #12
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par ptyxs Voir le message
    Il s'agit du code ASCII étendu, évidemment.
    UTF-8 reprend strictement le codage ASCII pour les caractères jusqu'à 127.
    UTF-8 est utilisé maintenant par les Unix et par Windows si je ne me trompe ? Pas seulement par "mon système"...

    Ton "d'où" me laisse perplexe par ailleurs... le second argument de substr() représentant une position de la chaine d'origine qui ne fera pas partie de la chaine extraite. substr(n,n+1) renvoie une chaine à 1 seul caractère, en principe.

    Je ne cherchais pas à m'embêter, juste à résoudre le problème de l'auteur du fil... il est vrai qu'il semble avoir disparu entretemps..
    Sous windows c'est pas le cas du terminal (ce qui explique mes précédentes remarque, croyant le PO sous windows.) . Mais sinon par défaut sous VS2008 les projets sont en UTF-8 il me semble non?
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  13. #13
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Goten Voir le message
    Mais sinon par défaut sous VS2008 les projets sont en UTF-8 il me semble non?
    Tu ne confondrais pas avec UNICODE par hasard ? Sous Visual 2005 (j'ai pas 2008), par défaut les projets sont maintenant en unicode.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  14. #14
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    En effet, toute mes excuses, n'étant pas un VC user...
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Mais même dans un projet Unicode (wchar_t), avec des fonctions d'entrées/sorties unicode (wchar_t), les mécanismes sous-jacents restent en char: fputws(L"Toto", pFile) écrira "toto" sous forme de char dans le fichier (sauf avec une extension Microsoft sur le second paramètre de fopen()).
    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.

  16. #16
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par ptyxs Voir le message
    Il s'agit du code ASCII étendu, évidemment.
    Ce qui ne veut pas dire grand chose, il existe un grand nombre de codages 8 bits. Sous windows c'est souvent windows-1252, sous linux ISO 8859-1, mais pas toujours, ça dépend de la locale.

    UTF-8 est utilisé maintenant par les Unix et par Windows si je ne me trompe ? Pas seulement par "mon système"...
    Par Windows non, en tout cas pas couramment. Par Linux oui, mais ça dépend de la locale, d'autre encodages peuvent aussi être utilisés.

    Ton "d'où" me laisse perplexe par ailleurs... le second argument de substr() représentant une position de la chaine d'origine qui ne fera pas partie de la chaine extraite. substr(n,n+1) renvoie une chaine à 1 seul caractère, en principe.
    Non le deuxième paramètre de substr() est le nombre de caractères (enfin d'octets ici) à extraire. Là est la difficulté d'UTF-8 : un caractère peut être représenté par plusieurs 'char'.

  17. #17
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Tu as parfaitement raison... je suis allé trop vite en besogne...

    Je garde de tout cela que le traitement des caractères dits 'spéciaux' de notre bonne vieille orthographe reste bien compliqué en C++

    Peut-on trouver une bonne doc à ce sujet ?

  18. #18
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Points : 92
    Points
    92
    Par défaut
    pour répondre a la questiode ram-0000
    j'ai fais le test mais ca ne fonticonne pas identique le code ne correspond pas

    j'utilise le compilateur borland est-ce que le problème viendraios de la peux etre.

    Sinon pour plus de presision et en reponce certain qui n'aurais pas compris

    j'ai un exercice pour mon ecole qui me demande de deaccentuer tous les accent d'une string.

    En fait je dois remplacer le caractère accenter par son caractère simple
    et pour ce faire j'ai fais un switch avec tous les code Ascii a paritir du 127 qui ont des accent ensuite en parcouant ma string caractère par caractère je retourne le code ascci du caratère et si celui la correspond a un qui est dans mon switch alors il le remolace par son caractère non accentuer.
    Le souci est comme je disais au debut est que pour un é en devrais me retourner le code 130 et lui me retourne le code -126 et c'est la que je comprend plus le pourquoi.
    Vous penser quew c'est parceque que on est dans de l'ascci etendue
    et que le borland ne le gere pas.
    Encore merci pour toute precision

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par diblasio Voir le message
    j'utilise le compilateur borland est-ce que le problème viendraios de la peux etre.
    C'est bien possible : ayant un compilateur VC++ et un compilateur GCC (MinGW32), si on tape, en VC++ (avec le CLR) :
    Console::WriteLine("é");
    la console affichera le é correctement.
    Pareil pour :
    std::cout << "é";

    En revanche, sous Code:Blocks (que j'utilise avec GCC), si on tape :
    std::cout << "é";
    voire
    printf("é");
    on obtiendra une virgule !

    As-tu déjà essayé de faire un tableau de caractères non signés ? du genre :
    UCHAR s[] = "é";

    Il me semble que créer un chaîne ASCII du type string puis un cast en unsigned char ne résolve rien : si on fait :
    float x = 15.5;
    int y = x; <-- OCTETS DIFFERENTS
    alors y sera égal à une troncature de x à l'unité alors que le codage d'un nombre à virgule flottante est TRES DIFFERENT de celui d'un nombre entier.

    Dans notre cas,
    unsigned char c = (unsigned char)s[1];
    est-il possible que c = 0 (ce qui semblerait logique) ?

  20. #20
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 160
    Points : 92
    Points
    92
    Par défaut
    en fait le problème viens du fait que l'editeur dos est en ansi tous simplement
    il faut un editeur ASCII

    Je vous remercie pour toute les reponse que vous m'avez fourni

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

Discussions similaires

  1. [C#][ADO] Enlever les caractère spéciaux
    Par Oberown dans le forum Windows Forms
    Réponses: 3
    Dernier message: 10/01/2005, 18h38
  2. [Jsp] Supprimer les caractère spéciaux d'une chaine
    Par PeteMitchell dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 13/05/2004, 11h11
  3. Réponses: 7
    Dernier message: 12/05/2003, 22h50
  4. Traiter les caractères spéciaux
    Par ricola dans le forum Langage
    Réponses: 2
    Dernier message: 20/02/2003, 09h23
  5. [PostgreSQL] Les caractères accentués ?
    Par yacomor dans le forum Requêtes
    Réponses: 2
    Dernier message: 18/02/2003, 16h30

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