Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2930 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Les accents dans uen chaine de caractère

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Les accents dans uen chaine de caractère

n°1139057
LordHarryP​otter
Posté le 04-07-2005 à 10:14:40  profilanswer
 

Voilà je dois faire un petit programme tout simple qui me dit si telle phrase est un palindrome ('alila est un palindrome mais également 'il était ti ATeli'). J'ai juste un problème avec lmes accents à,â,Ä ..)
 
pour ce faire j'analyse mastring à l'aide de deux pointeur (un pointeur pointe vers le premier caractère et le second sur le dernier je comprare les deux caractères si les deux sont différent de ' ')
 

Code :
  1. bool EstUnPalindrome(string str, bool& palindromepaire,int& caractere_deb_error , int& caractere_fin_error)
  2. {
  3. bool estunpalindrome = true ;
  4. string::const_iterator it_car_deb = str.begin() ;
  5. string::const_iterator it_car_fin = str.end()-1   ;
  6. int char_number_deb = 0 ;
  7. int char_number_fin = str.length()-1 ;
  8. signed char char_analysed ;
  9. unsigned char lowercase_deb ;
  10. unsigned char lowercase_fin ;
  11. signed char char_compared ;
  12. do
  13. {
  14.  char_analysed = str[char_number_deb] ;
  15.  switch (char_analysed)//(*it_car_deb)
  16.  {
  17.  case 'Ä':
  18.   lowercase_deb = 'a' ;
  19.   break ;
  20.   case 'ä':
  21.   lowercase_deb = 'a' ;
  22.   break ;
  23.   case 'à':
  24.   lowercase_deb = 'a' ;
  25.   break ;
  26.  case 'Ç':
  27.  case 'ç':
  28.   lowercase_deb = 'c' ;
  29.   break ;
  30.  case 'É':
  31.  case 'È':
  32.  case 'Ê':
  33.  case 'Ë':
  34.  case 'é':
  35.  case 'è':
  36.  case 'ê':
  37.  case 'ë':
  38.   lowercase_deb = 'e' ;
  39.   break ;
  40.  case 'Ï':
  41.  case 'Î':
  42.   lowercase_deb = 'i' ;
  43.   break ;
  44.  case 'ï':
  45.  case 'î':
  46.   lowercase_deb = 'i' ;
  47.   break ;
  48.  case 'Ö':
  49.  case 'ö':
  50.   lowercase_deb = 'o' ;
  51.   break ;
  52.  case 'Ü':
  53.  case 'Û':
  54.  case 'ü':
  55.  case 'û':
  56.   lowercase_deb = 'u' ;
  57.   break ;
  58.  default : lowercase_deb = tolower(str[char_number_deb]);//(*it_car_deb);
  59.  }
  60. //...
  61. }
  62. while ( (char_number_deb<char_number_fin) && (estunpalindrome) ) ; //(it_car_deb<it_car_fin)


 
Le problème c'est que si str = "àdedA", le première fois que je vais dans mon switch, il va directement dans le cas default :(
 
Quelqu'un peut il m'aider car  la manipulation de chîane de caractère (surtout les problèmes d'accents c'est pas ce qui me passionne dans la programmation. Merci

mood
Publicité
Posté le 04-07-2005 à 10:14:40  profilanswer
 

n°1139067
Taz
bisounours-codeur
Posté le 04-07-2005 à 10:22:19  profilanswer
 

ben ça c'est mité si t'as chaine c'est autre chose que de l'iso 8859-15. normalement tolower doit prendre ça en compte.

n°1139070
LordHarryP​otter
Posté le 04-07-2005 à 10:23:39  profilanswer
 

Non tolower va remplacer le â en  or moi je veux changer en A  :/

n°1139073
Taz
bisounours-codeur
Posté le 04-07-2005 à 10:25:49  profilanswer
 

c'est actuellement un problème non résolu tout ça, c'est trop dépendant des locales et du codages des caractères.

n°1139094
LordHarryP​otter
Posté le 04-07-2005 à 10:54:55  profilanswer
 

Donc ya pas de solutions ???

n°1139096
Taz
bisounours-codeur
Posté le 04-07-2005 à 10:58:07  profilanswer
 

à part faire ce que tu fais ... ou tout simplement d'accepter que le l'ascii (ou bien ne pas considérer les accents comme spéciaux).

n°1141260
theredled
● REC
Posté le 05-07-2005 à 20:36:56  profilanswer
 

Et si tu mets le code ASCII des caractères a la place des caractères dans ton switch ?

n°1141261
Taz
bisounours-codeur
Posté le 05-07-2005 à 20:37:32  profilanswer
 

n'importe quoi ... 'a' tu crois que c'est quoi banane

n°1141268
theredled
● REC
Posté le 05-07-2005 à 20:56:04  profilanswer
 

je parlais de 'Â' cerise

n°1141271
theredled
● REC
Posté le 05-07-2005 à 20:58:47  profilanswer
 

excuse moi pour le cerise

mood
Publicité
Posté le 05-07-2005 à 20:58:47  profilanswer
 

n°1141281
Taz
bisounours-codeur
Posté le 05-07-2005 à 21:08:18  profilanswer
 

même remarque

n°1141285
theredled
● REC
Posté le 05-07-2005 à 21:12:20  profilanswer
 

Moi quand je fais ça :

Code :
  1. char ch = 'ä';
  2. std::cout << ch;


j'ai des surprises (gcc)
 
Alors quand tu fais ça :

Code :
  1. char ch;
  2. std::cin >> ch; // <- là tu saisis ä
  3. if (ch=='ä') cout << "winner";
  4. else cout << "???";


Si t'es comme moi, tu va en avoir aussi.
 
Ne serais-ce que

Code :
  1. cout << "où ça a été ?";

te donne un resultat très spécial.
 
la table de caractère de l'éditeur n'est pas forcément celle de la console, c'est ce que je veux dire.


Message édité par theredled le 05-07-2005 à 21:14:58
n°1141297
Taz
bisounours-codeur
Posté le 05-07-2005 à 21:23:53  profilanswer
 

c'est parce que vous utilisez 36 charsets différents, c'est tout.

n°1141328
theredled
● REC
Posté le 05-07-2005 à 21:37:44  profilanswer
 

Et comment tu fais pour n'en avoir qu'un ?

n°1141435
Taz
bisounours-codeur
Posté le 05-07-2005 à 22:35:40  profilanswer
 

ben tu n'en utilises qu'une. Moi j'utilise UTF-8
 

Code :
  1. #include <iostream>
  2. #include <string>
  3. #include <iomanip>
  4. #include <clocale>
  5. #include <glibmm.h>
  6. namespace
  7. {
  8.   template<typename Seq>
  9.   void dump(const Seq& s)
  10.   {
  11.     typedef typename Seq::const_iterator const_iterator;
  12.     std::cout << s << '\n';
  13.     for(const_iterator i(s.begin()); i != s.end(); ++i)
  14.       {
  15. std::cout << '\t'
  16.    << std::hex << static_cast<int>(*i) << " -> '" << *i << "'\n";
  17.       }
  18.     std::cout << '\n';
  19.   }
  20. }
  21. int main()
  22. try
  23. {
  24.   std::setlocale(LC_ALL, "" );
  25.   std::string line;
  26.   while(std::getline(std::cin, line))
  27.     {
  28.       dump(line);
  29.       dump(Glib::ustring(line));
  30.       std::cout << '\n';
  31.     }
  32. }
  33. catch(Glib::Exception &ce)
  34. {
  35.   std::cerr << ce.what() << '\n';
  36. }


 
 
std::setlocale(LC_ALL, "" );
 
très important. bienvenu dans le monde merveilleux des locales

n°1141544
theredled
● REC
Posté le 06-07-2005 à 00:30:06  profilanswer
 

Comprend pas bien a qui tu a répondu pour ton code... En tout cas <glibmm.h> DevCpp y connait pas, donc je n'ai pas pu résoudre l'énigme de pourquoi ce code... Charset ? Palindrome ?
 
Si c'est apr rapport au charset unique merci (bien que ca marche pas), sinon comment faire n'utiliser qu'une charset, UTF-8 ou pas ? (Systéme Windows pour moi, c'est peut etre le pb)

n°1141546
Kristoph
Posté le 06-07-2005 à 00:35:38  profilanswer
 

Qq a donné la solution pour faire ça en Python. Ça doit pouvoir s'applique en d'autres langages avec un peu de bonne volontée :)

Code :
  1. from unicodedata import decomposition
  2. def enleveAccent(car):
  3.      deco = decomposition(car)
  4.      if deco:
  5.          return chr( int( deco.split()[0] ,16) )
  6.      else:
  7.          return car


Il suffit juste de trouver la fonction "decomposition" et c'est bon.
 
A noter que ça marche aussi pour les ç et les Ç par exemple.

n°1141550
Taz
bisounours-codeur
Posté le 06-07-2005 à 00:47:22  profilanswer
 

mais arrêtez ... vous comprenez rien à rien.
 
le problème c'est qu'il y a 3 locales / jeu de caractères :
- celle de votre éditeur de code
- celle de votre environnement
- celle de votre compilateur et de celle de votre bibliothèque
 
une locale peut utiliser des jeu de caractères multioctets (comme UTF-8). Donc toutes les solutions que vous proposez, ça ne marche que pour de l'ASCII étendu, et uniquement en faisant des tables de correspondances simples. Sinon, il faut utiliser des bibliothèques spécialisées. Mais avant toute chose, il faut savoir et gérer ces locales correctement. Ce qu'ici personne ne semble comprendre.
 
Aurevoir.

n°1141558
theredled
● REC
Posté le 06-07-2005 à 00:56:42  profilanswer
 

Moi je veux bien connaitre et savoir utiliser ces locales perso, j'ai jamais dit le contraire
 
mais glibmm.h tu la trouve où ?

n°1153253
Taz
bisounours-codeur
Posté le 19-07-2005 à 02:21:33  profilanswer
 

sur google, comme tout ...


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Les accents dans uen chaine de caractère

 

Sujets relatifs
pb pour créer un lien à partir dune chaine avec des quotesEnlever les accents ?
tronquer une partie d'une chaîne[php-mySQL] recherche dans une base mySQL problème d'accents
N'afficher que X caractères d'une chaineListBox ou ListView => chaîne trop longue, cmt passer à la ligne
transformation code HTML vers caractère chinois(UTF-8)Comment choisir ses 'polices de caractère'?
[C++] Template & Liste chaîné[PHP] Accents dans une chaine de caractère
Plus de sujets relatifs à : Les accents dans uen chaine de caractère


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR