Les accents dans uen chaine de caractère

Les accents dans uen chaine de caractère - C++ - Programmation

Marsh Posté le 04-07-2005 à 10:14:40    

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

Reply

Marsh Posté le 04-07-2005 à 10:14:40   

Reply

Marsh Posté le 04-07-2005 à 10:22:19    

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.

Reply

Marsh Posté le 04-07-2005 à 10:23:39    

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

Reply

Marsh Posté le 04-07-2005 à 10:25:49    

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

Reply

Marsh Posté le 04-07-2005 à 10:54:55    

Donc ya pas de solutions ???

Reply

Marsh Posté le 04-07-2005 à 10:58:07    

à 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).

Reply

Marsh Posté le 05-07-2005 à 20:36:56    

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

Reply

Marsh Posté le 05-07-2005 à 20:37:32    

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

Reply

Marsh Posté le 05-07-2005 à 20:56:04    

je parlais de 'Â' cerise

Reply

Marsh Posté le 05-07-2005 à 20:58:47    

excuse moi pour le cerise

Reply

Marsh Posté le 05-07-2005 à 20:58:47   

Reply

Marsh Posté le 05-07-2005 à 21:08:18    

même remarque

Reply

Marsh Posté le 05-07-2005 à 21:12:20    

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
Reply

Marsh Posté le 05-07-2005 à 21:23:53    

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

Reply

Marsh Posté le 05-07-2005 à 21:37:44    

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

Reply

Marsh Posté le 05-07-2005 à 22:35:40    

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

Reply

Marsh Posté le 06-07-2005 à 00:30:06    

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)

Reply

Marsh Posté le 06-07-2005 à 00:35:38    

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.

Reply

Marsh Posté le 06-07-2005 à 00:47:22    

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.

Reply

Marsh Posté le 06-07-2005 à 00:56:42    

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

Reply

Marsh Posté le 19-07-2005 à 02:21:33    

sur google, comme tout ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed