Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: user-marcos en 9 Julio 2015, 23:58 pm



Título: Quitar acentos de un string
Publicado por: user-marcos en 9 Julio 2015, 23:58 pm
Necesito quitar acentos de un string, llevo 2 horas y he probado todo lo que se me ocurre, ya dudo hasta si es posible quitarlos con c++.
¿Se os ocurre algo?


Título: Re: Quitar acentos de un string
Publicado por: Kaxperday en 10 Julio 2015, 00:11 am
Los acentos los llevan solo las vocales, hay 5 vocales. Las vocales con acento representan 5 carácteres que están fuera del rango ASCII.

Código
  1. printf("%d %d %d %d %d", 'á', 'é', 'í', 'ó', 'ú');

La salida es:

Código:
-31 -23 -19 -13 -6

Simplemente cuando encuentre un caracter con uno de esos valores lo tienes que sustituir por el caracter ASCII de la vocal sin acentuación.

Código
  1. if(caracter==-31)
  2. {
  3. caracter='a';
  4. }

Edito: o que leches, simplemente:

Código
  1. if(caracter=='á')
  2. {
  3. caracter='a';
  4. }

Creo haber entendido que quiere quitar los acentos para sustituirlos por vocales sin acentos. Si quieres eliminar los acentos de una cadena, utiliza este método para identificarlos y luego simplemente copia caracter a caracter en otra cadena, utilizando a ser posible reserva de memoria dinámica.

Saludos.


Título: Re: Quitar acentos de un string
Publicado por: user-marcos en 10 Julio 2015, 00:22 am
Código
  1. if( cadena == 'á')
  2.  
no se puede, y ami me sale que las vocales con acento valen dos char


Título: Re: Quitar acentos de un string
Publicado por: Kaxperday en 10 Julio 2015, 00:26 am
Pero que quieres hacer, ¿eliminar los acentos o cambiar los carácteres por vocales sin acento?

Edito: no puedes igualar una cadena a un caracter.

Tendrías que coger un elemento de la cadena, ejemplo cadena[0].

Saludos.

Prueba esto:

Código
  1. string cadena = "hola quiero eliminar los caráceteres acentuados de ésta cadéna";
  2. remove(cadena.begin(), cadena.end(), 'á');
  3. remove(cadena.begin(), cadena.end(), 'é');
  4. remove(cadena.begin(), cadena.end(), 'í');
  5. remove(cadena.begin(), cadena.end(), 'ó');
  6. remove(cadena.begin(), cadena.end(), 'ù');
  7. printf("%s", cadena.c_str());

Salida:

Citar
hola quiero eliminar los carceteres acentuados de sta cadna

 :xD :xD :xD :xD


Título: Re: Quitar acentos de un string
Publicado por: user-marcos en 10 Julio 2015, 00:27 am
El objetivo el transformar unas 15000 urls, quiero quitar acentos de mayúsculas, minúsculas y la ñ, el problema los acentos no caben en un char y por eso no se puede comparar.


Título: Re: Quitar acentos de un string
Publicado por: ivancea96 en 10 Julio 2015, 00:32 am
Código
  1. void quitarAcentos(std::string &str){
  2.    static const std::string t = "aáàâäeéèêëiíìîïoóòôöuúùûüAÁÀÄEÉÈÊËIÍÌÎÏOÓÒÔÖUÚÙÛÜnññññNÑÑÑÑ";
  3.    static const unsigned char n = 5; // Numero de acentos diferentes (+ base) por vocal
  4.    for(int i=0; i<str.size(); i++){
  5.        size_t pos = t.find(str[i]);
  6.        if(pos!=std::string::npos){
  7.            str[i] = t[(pos/n)*n];
  8.        }
  9.    }
  10. }

EDITO: La A mayúscula con acento circulflejo (^) no se ve. Acuerdate de añadirla si usas este código.


Título: Re: Quitar acentos de un string
Publicado por: Stakewinner00 en 10 Julio 2015, 00:34 am
Si el objetivo es que solo haya chars ASCII valdría algo como
Código
  1. #include <iostream>
  2. #include <string>
  3.  
  4. int main()
  5. {
  6.  std::string s;
  7.  std::cin >> s;
  8.  for(unsigned c : s)
  9.    if(c < 127)
  10.      std::cout << char(c);
  11. }


Título: Re: Quitar acentos de un string
Publicado por: ivancea96 en 10 Julio 2015, 00:38 am
Código
  1. if( cadena == 'á')
  2.  
no se puede, y ami me sale que las vocales con acento valen dos char

Pasa el error que te lanza, para saber todos los datos.


Título: Re: Quitar acentos de un string
Publicado por: user-marcos en 10 Julio 2015, 00:45 am
Pasa el error que te lanza, para saber todos los datos.
Eso es lo mismo que hacer
Código
  1. int n;
  2. if ( n == 5.55)
esta fuera de rango


Título: Re: Quitar acentos de un string
Publicado por: user-marcos en 10 Julio 2015, 00:47 am
Código
  1. void quitarAcentos(std::string &str){
  2.    static const std::string t = "aáàâäeéèêëiíìîïoóòôöuúùûüAÁÀÄEÉÈÊËIÍÌÎÏOÓÒÔÖUÚÙÛÜnññññNÑÑÑÑ";
  3.    static const unsigned char n = 5; // Numero de acentos diferentes (+ base) por vocal
  4.    for(int i=0; i<str.size(); i++){
  5.        size_t pos = t.find(str[i]);
  6.        if(pos!=std::string::npos){
  7.            str[i] = t[(pos/n)*n];
  8.        }
  9.    }
  10. }

EDITO: La A mayúscula con acento circulflejo (^) no se ve. Acuerdate de añadirla si usas este código.

Código
  1.  string s = "áéíóú";
  2.  quitarAcentos(s);
  3.  cout << s;
  4. //salida ->aaa&#65533;a&#65533;a&#65533;a&#65533;
  5.  
Empiezo a pensar que el problema lo tengo en el ordenador, quizá me falte instalar más codificaciones.


Título: Re: Quitar acentos de un string
Publicado por: ivancea96 en 10 Julio 2015, 00:48 am
El error en la instrucción de antes. El error da más información.

A todo esto, pusiste

Código
  1. cadena == 'á'

¿cadena es un char? ¿No será un char*?


Título: Re: Quitar acentos de un string
Publicado por: Stakewinner00 en 10 Julio 2015, 00:48 am
Eso es lo mismo que hacer
Código
  1. int n;
  2. if ( n == 5.55)
esta fuera de rango

Te refieres a este warning
Citar
warning: multi-character character constant [-Wmultichar]
? En ese caso no es un error, es un warning, que esta bien tratarlos como errores pero no lo son, aunque no se que mensaje te salio y como lo trato el compilador


Título: Re: Quitar acentos de un string
Publicado por: ivancea96 en 10 Julio 2015, 00:49 am
¿Qué compilador utilizas? ¿Qué codificación tiene el fichero .cpp?


Título: Re: Quitar acentos de un string
Publicado por: user-marcos en 10 Julio 2015, 01:01 am
Código
  1.  string s = "á";
  2.  if(s == 'á')
  3.    cout << "\nok";
  4.  
el error:
a.cc:14:11: warning: multi-character character constant [-Wmultichar]
   if(s == 'á')
           ^
a.cc: In function ‘int main()’:
a.cc:14:8: error: no match for ‘operator==’ (operand types are ‘std::string {aka std::basic_string<char>}’ and ‘int’)
   if(s == 'á')
        ^
a.cc:14:8: note: candidates are:
In file included from /usr/include/c++/4.8/iosfwd:40:0,
                 from /usr/include/c++/4.8/ios:38,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from a.cc:1:
/usr/include/c++/4.8/bits/postypes.h:216:5: note: template<class _StateT> bool std::operator==(const std::fpos<_StateT>&, const std::fpos<_StateT>&)
     operator==(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
     ^
/usr/include/c++/4.8/bits/postypes.h:216:5: note:   template argument deduction/substitution failed:
a.cc:14:11: note:   ‘std::string {aka std::basic_string<char>}’ is not derived from ‘const std::fpos<_StateT>’
   if(s == 'á')
           ^
In file included from /usr/include/c++/4.8/bits/stl_algobase.h:64:0,
                 from /usr/include/c++/4.8/bits/char_traits.h:39,
                 from /usr/include/c++/4.8/ios:40,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from a.cc:1:
/usr/include/c++/4.8/bits/stl_pair.h:214:5: note: template<class _T1, class _T2> bool std::operator==(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&)
     operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
     ^
/usr/include/c++/4.8/bits/stl_pair.h:214:5: note:   template argument deduction/substitution failed:
a.cc:14:11: note:   ‘std::string {aka std::basic_string<char>}’ is not derived from ‘const std::pair<_T1, _T2>’
   if(s == 'á')
           ^
In file included from /usr/include/c++/4.8/bits/stl_algobase.h:67:0,
                 from /usr/include/c++/4.8/bits/char_traits.h:39,
                 from /usr/include/c++/4.8/ios:40,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from a.cc:1:
/usr/include/c++/4.8/bits/stl_iterator.h:291:5: note: template<class _Iterator> bool std::operator==(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_Iterator>&)
     operator==(const reverse_iterator<_Iterator>& __x,
     ^
/usr/include/c++/4.8/bits/stl_iterator.h:291:5: note:   template argument deduction/substitution failed:
a.cc:14:11: note:   ‘std::string {aka std::basic_string<char>}’ is not derived from ‘const std::reverse_iterator<_Iterator>’
   if(s == 'á')
           ^
In file included from /usr/include/c++/4.8/bits/stl_algobase.h:67:0,
                 from /usr/include/c++/4.8/bits/char_traits.h:39,
                 from /usr/include/c++/4.8/ios:40,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from a.cc:1:
/usr/include/c++/4.8/bits/stl_iterator.h:341:5: note: template<class _IteratorL, class _IteratorR> bool std::operator==(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_IteratorR>&)
     operator==(const reverse_iterator<_IteratorL>& __x,
     ^
/usr/include/c++/4.8/bits/stl_iterator.h:341:5: note:   template argument deduction/substitution failed:
a.cc:14:11: note:   ‘std::string {aka std::basic_string<char>}’ is not derived from ‘const std::reverse_iterator<_Iterator>’
   if(s == 'á')
           ^
In file included from /usr/include/c++/4.8/string:41:0,
                 from /usr/include/c++/4.8/bits/locale_classes.h:40,
                 from /usr/include/c++/4.8/bits/ios_base.h:41,
                 from /usr/include/c++/4.8/ios:42,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from a.cc:1:
/usr/include/c++/4.8/bits/allocator.h:128:5: note: template<class _T1, class _T2> bool std::operator==(const std::allocator<_CharT>&, const std::allocator<_T2>&)
     operator==(const allocator<_T1>&, const allocator<_T2>&)
     ^
/usr/include/c++/4.8/bits/allocator.h:128:5: note:   template argument deduction/substitution failed:
a.cc:14:11: note:   ‘std::string {aka std::basic_string<char>}’ is not derived from ‘const std::allocator<_CharT>’
   if(s == 'á')
           ^
In file included from /usr/include/c++/4.8/string:41:0,
                 from /usr/include/c++/4.8/bits/locale_classes.h:40,
                 from /usr/include/c++/4.8/bits/ios_base.h:41,
                 from /usr/include/c++/4.8/ios:42,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from a.cc:1:
/usr/include/c++/4.8/bits/allocator.h:133:5: note: template<class _Tp> bool std::operator==(const std::allocator<_CharT>&, const std::allocator<_CharT>&)
     operator==(const allocator<_Tp>&, const allocator<_Tp>&)
     ^
/usr/include/c++/4.8/bits/allocator.h:133:5: note:   template argument deduction/substitution failed:
a.cc:14:11: note:   ‘std::string {aka std::basic_string<char>}’ is not derived from ‘const std::allocator<_CharT>’
   if(s == 'á')
           ^
In file included from /usr/include/c++/4.8/string:52:0,
                 from /usr/include/c++/4.8/bits/locale_classes.h:40,
                 from /usr/include/c++/4.8/bits/ios_base.h:41,
                 from /usr/include/c++/4.8/ios:42,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from a.cc:1:
/usr/include/c++/4.8/bits/basic_string.h:2486:5: note: template<class _CharT, class _Traits, class _Alloc> bool std::operator==(const std::basic_string<_CharT, _Traits, _Alloc>&, const std::basic_string<_CharT, _Traits, _Alloc>&)
     operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
     ^
/usr/include/c++/4.8/bits/basic_string.h:2486:5: note:   template argument deduction/substitution failed:
a.cc:14:11: note:   mismatched types ‘const std::basic_string<_CharT, _Traits, _Alloc>’ and ‘int’
   if(s == 'á')
           ^
In file included from /usr/include/c++/4.8/string:52:0,
                 from /usr/include/c++/4.8/bits/locale_classes.h:40,
                 from /usr/include/c++/4.8/bits/ios_base.h:41,
                 from /usr/include/c++/4.8/ios:42,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from a.cc:1:
/usr/include/c++/4.8/bits/basic_string.h:2493:5: note: template<class _CharT> typename __gnu_cxx::__enable_if<std::__is_char<_Tp>::__value, bool>::__type std::operator==(const std::basic_string<_CharT>&, const std::basic_string<_CharT>&)
     operator==(const basic_string<_CharT>& __lhs,
     ^
/usr/include/c++/4.8/bits/basic_string.h:2493:5: note:   template argument deduction/substitution failed:
a.cc:14:11: note:   mismatched types ‘const std::basic_string<_CharT>’ and ‘int’
   if(s == 'á')
           ^
In file included from /usr/include/c++/4.8/string:52:0,
                 from /usr/include/c++/4.8/bits/locale_classes.h:40,
                 from /usr/include/c++/4.8/bits/ios_base.h:41,
                 from /usr/include/c++/4.8/ios:42,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from a.cc:1:
/usr/include/c++/4.8/bits/basic_string.h:2507:5: note: template<class _CharT, class _Traits, class _Alloc> bool std::operator==(const _CharT*, const std::basic_string<_CharT, _Traits, _Alloc>&)
     operator==(const _CharT* __lhs,
     ^
/usr/include/c++/4.8/bits/basic_string.h:2507:5: note:   template argument deduction/substitution failed:
a.cc:14:11: note:   mismatched types ‘const _CharT*’ and ‘std::basic_string<char>’
   if(s == 'á')
           ^
In file included from /usr/include/c++/4.8/string:52:0,
                 from /usr/include/c++/4.8/bits/locale_classes.h:40,
                 from /usr/include/c++/4.8/bits/ios_base.h:41,
                 from /usr/include/c++/4.8/ios:42,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from a.cc:1:
/usr/include/c++/4.8/bits/basic_string.h:2519:5: note: template<class _CharT, class _Traits, class _Alloc> bool std::operator==(const std::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*)
     operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
     ^
/usr/include/c++/4.8/bits/basic_string.h:2519:5: note:   template argument deduction/substitution failed:
a.cc:14:11: note:   mismatched types ‘const _CharT*’ and ‘int’
   if(s == 'á')
           ^
In file included from /usr/include/c++/4.8/bits/locale_facets.h:48:0,
                 from /usr/include/c++/4.8/bits/basic_ios.h:37,
                 from /usr/include/c++/4.8/ios:44,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from a.cc:1:
/usr/include/c++/4.8/bits/streambuf_iterator.h:204:5: note: template<class _CharT, class _Traits> bool std::operator==(const std::istreambuf_iterator<_CharT, _Traits>&, const std::istreambuf_iterator<_CharT, _Traits>&)
     operator==(const istreambuf_iterator<_CharT, _Traits>& __a,
     ^
/usr/include/c++/4.8/bits/streambuf_iterator.h:204:5: note:   template argument deduction/substitution failed:
a.cc:14:11: note:   ‘std::string {aka std::basic_string<char>}’ is not derived from ‘const std::istreambuf_iterator<_CharT, _Traits>’
   if(s == 'á')
           ^
In file included from /usr/include/x86_64-linux-gnu/c++/4.8/bits/c++allocator.h:33:0,
                 from /usr/include/c++/4.8/bits/allocator.h:46,
                 from /usr/include/c++/4.8/string:41,
                 from /usr/include/c++/4.8/bits/locale_classes.h:40,
                 from /usr/include/c++/4.8/bits/ios_base.h:41,
                 from /usr/include/c++/4.8/ios:42,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from a.cc:1:
/usr/include/c++/4.8/ext/new_allocator.h:139:5: note: template<class _Tp> bool __gnu_cxx::operator==(const __gnu_cxx::new_allocator<_Tp>&, const __gnu_cxx::new_allocator<_Tp>&)
     operator==(const new_allocator<_Tp>&, const new_allocator<_Tp>&)
     ^
/usr/include/c++/4.8/ext/new_allocator.h:139:5: note:   template argument deduction/substitution failed:
a.cc:14:11: note:   ‘std::string {aka std::basic_string<char>}’ is not derived from ‘const __gnu_cxx::new_allocator<_Tp>’
   if(s == 'á')
           ^
In file included from /usr/include/c++/4.8/bits/stl_algobase.h:67:0,
                 from /usr/include/c++/4.8/bits/char_traits.h:39,
                 from /usr/include/c++/4.8/ios:40,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from a.cc:1:
/usr/include/c++/4.8/bits/stl_iterator.h:811:5: note: template<class _Iterator, class _Container> bool __gnu_cxx::operator==(const __gnu_cxx::__normal_iterator<_Iterator, _Container>&, const __gnu_cxx::__normal_iterator<_Iterator, _Container>&)
     operator==(const __normal_iterator<_Iterator, _Container>& __lhs,
     ^
/usr/include/c++/4.8/bits/stl_iterator.h:811:5: note:   template argument deduction/substitution failed:
a.cc:14:11: note:   ‘std::string {aka std::basic_string<char>}’ is not derived from ‘const __gnu_cxx::__normal_iterator<_Iterator, _Container>’
   if(s == 'á')
           ^
In file included from /usr/include/c++/4.8/bits/stl_algobase.h:67:0,
                 from /usr/include/c++/4.8/bits/char_traits.h:39,
                 from /usr/include/c++/4.8/ios:40,
                 from /usr/include/c++/4.8/ostream:38,
                 from /usr/include/c++/4.8/iostream:39,
                 from a.cc:1:
/usr/include/c++/4.8/bits/stl_iterator.h:805:5: note: template<class _IteratorL, class _IteratorR, class _Container> bool __gnu_cxx::operator==(const __gnu_cxx::__normal_iterator<_IteratorL, _Container>&, const __gnu_cxx::__normal_iterator<_IteratorR, _Container>&)
     operator==(const __normal_iterator<_IteratorL, _Container>& __lhs,
     ^
/usr/include/c++/4.8/bits/stl_iterator.h:805:5: note:   template argument deduction/substitution failed:
a.cc:14:11: note:   ‘std::string {aka std::basic_string<char>}’ is not derived from ‘const __gnu_cxx::__normal_iterator<_IteratorL, _Container>’
   if(s == 'á')


Título: Re: Quitar acentos de un string
Publicado por: ivancea96 en 10 Julio 2015, 01:04 am
Código:
(operand types are ‘std::string {aka std::basic_string<char>}’ and ‘int’)

Estás comparando una string con un caracter. No puedes hacer eso. O haces s[0], o haces "á".


Título: Re: Quitar acentos de un string
Publicado por: user-marcos en 10 Julio 2015, 01:24 am
Tengo una posible solución PROVISIONAL aunque puede desbordar:

Código
  1. #include<iostream>
  2. #include <cstring>
  3. using namespace std;
  4.  
  5.  
  6. bool cod_aux(string &s);
  7. void cod(string &s);
  8.  
  9.  
  10. int main()
  11. {
  12.  
  13.  string j = "áóÁsÚíu";
  14.  cod(j);
  15.  cout << endl << j;//-> aoAsUiu
  16. }
  17.  
  18.  
  19. void cod(string &s)
  20. {
  21.  string aux = "";
  22.  string aux2 = "";
  23.  bool add = false;
  24.  char auxc;
  25.  for(int i = 0; i < s.length(); i++)
  26.  {
  27.    aux +=s[i];
  28.    aux +=s[i+1];
  29.    if(cod_aux(aux) == false)
  30.    {
  31.     aux2 += aux;
  32.     i = i +1;
  33.    }
  34.    else aux2 +=s[i];
  35.  
  36.      aux = "";
  37.  }
  38.    s = aux2;
  39. }
  40.  
  41.  
  42. bool cod_aux(string &s)
  43. {
  44.  string aux = s;
  45.  if(s == "á")
  46.    s = "a";
  47.  if(s == "Á")
  48.     s = "A";
  49.  if(s == "é")
  50.    s = "e";
  51.  if(s == "É")
  52.     s = "E";
  53.  if(s == "í")
  54.    s = "i";
  55.  if(s == "Í")
  56.    s = "I";
  57.  if(s == "Ó")
  58.     s = "O";    
  59.  if(s == "ó")
  60.     s = "o";
  61.  if(s == "Ú")
  62.     s = "U";    
  63.  if(s == "ú")
  64.     s = "u";
  65.   return aux == s;
  66. }
  67.  


Título: Re: Quitar acentos de un string
Publicado por: ivancea96 en 10 Julio 2015, 01:33 am
Código
  1. aux +=s[i+1];

Eso puede acceder a s[ s.length() ].

En cualquier caso, string::find() será más interesante que usar tal cadena de if().

Además, trata de hacer comparaciones y asignaciones con caracteres y no con strings. Tal vez simplemente tengas una extraña codificación.


Título: Re: Quitar acentos de un string
Publicado por: Stakewinner00 en 10 Julio 2015, 01:44 am
Además, trata de hacer comparaciones y asignaciones con caracteres y no con strings. Tal vez simplemente tengas una extraña codificación.
Si no recuerdo mal á é y demás se almacenan internamente como const char* así que ya esta bien comparar con strings creo.


Título: Re: Quitar acentos de un string
Publicado por: geeke en 10 Julio 2015, 01:46 am
Código
  1. if( cadena == 'á')
  2.  
no se puede, y ami me sale que las vocales con acento valen dos char

Los caracteres acentuados se componen de dos bytes, mientras los sin acento se representan con un solo byte, intenta probando esto

Código
  1. if( cadena == (unsigned char)('á'))

Saludos





Título: Re: Quitar acentos de un string
Publicado por: ivancea96 en 10 Julio 2015, 01:47 am
Si no recuerdo mal á é y demás se almacenan internamente como const char* así que ya esta bien comparar con strings creo.

Si pero bueno, es preferible comparar con char que es más eficiente xD

De todas formas, user_marcos, prueba con wstring, que utiliza wide char.


Título: Re: Quitar acentos de un string
Publicado por: Stakewinner00 en 10 Julio 2015, 01:49 am
Los caracteres acentuados se componen de dos bytes, mientras los sin acento se representan con un solo byte, intenta probando esto

Código
  1. if( cadena == (unsigned char)('á'))

Pero comparar una cosa de la clase std::string con un unsigned char no se puede hacer así tal cual,


Título: Re: Quitar acentos de un string
Publicado por: WHK en 10 Julio 2015, 01:56 am
Si el código está hecho en utf8 o en latín iso y usas otra codificación en la entrada de texto del terminal no realizará las validaciones ya que á en utf8 no es lo mismo que á en latín iso o en otras codificaciones ya que el valor decimal es diferente.

Lo que yo haría es crear la misma lista blanca pero con sus valores respectivos en decimal y detectar la codificación del texto y en base a eso realizar la conversión

Ahora, una pregunta: necesitas reemplazar únicamente acentos? que pasa con las eñes y ¨? y los demás caracteres especiales que se usan en otros lenguajes?

Mira, acá hay un proyecto que ya hace lo que necesitas:
http://stackoverflow.com/questions/2992066/code-to-strip-diacritical-marks-using-icu
http://stackoverflow.com/questions/144761/how-to-remove-accents-and-tilde-in-a-c-stdstring

http://site.icu-project.org/


Título: Re: Quitar acentos de un string
Publicado por: user-marcos en 10 Julio 2015, 02:06 am
Ahora, una pregunta: necesitas reemplazar únicamente acentos? que pasa con las eñes y ¨? y los demás caracteres especiales que se usan en otros lenguajes?
Los demás caracteres los voy a quitar, sólo me insertaban los acentos para que las urls no me pierdan el sentido.
Gracias a todos por la ayuda.


Título: Re: Quitar acentos de un string
Publicado por: WHK en 10 Julio 2015, 19:55 pm
Ahhh es para formatear urls amigables, entonces dale un vistazo a esto:

https://github.com/WordPress/WordPress/blob/master/wp-includes/formatting.php#LC968

Te servirá para crear reglas similares en c++, está hecho en php y es la función nativa de Wordpress para crear las urls amigables:

Código
  1. function remove_accents( $string ) {
  2. if ( !preg_match('/[\x80-\xff]/', $string) )
  3. return $string;
  4. if (seems_utf8($string)) {
  5. $chars = array(
  6. // Decompositions for Latin-1 Supplement
  7. chr(194).chr(170) => 'a', chr(194).chr(186) => 'o',
  8. chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
  9. chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
  10. chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
  11. chr(195).chr(134) => 'AE',chr(195).chr(135) => 'C',
  12. chr(195).chr(136) => 'E', chr(195).chr(137) => 'E',
  13. chr(195).chr(138) => 'E', chr(195).chr(139) => 'E',
  14. chr(195).chr(140) => 'I', chr(195).chr(141) => 'I',
  15. chr(195).chr(142) => 'I', chr(195).chr(143) => 'I',
  16. chr(195).chr(144) => 'D', chr(195).chr(145) => 'N',
  17. chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
  18. chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
  19. chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
  20. chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
  21. chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
  22. chr(195).chr(158) => 'TH',chr(195).chr(159) => 's',
  23. chr(195).chr(160) => 'a', chr(195).chr(161) => 'a',
  24. chr(195).chr(162) => 'a', chr(195).chr(163) => 'a',
  25. chr(195).chr(164) => 'a', chr(195).chr(165) => 'a',
  26. chr(195).chr(166) => 'ae',chr(195).chr(167) => 'c',
  27. chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
  28. chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
  29. chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
  30. chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
  31. chr(195).chr(176) => 'd', chr(195).chr(177) => 'n',
  32. chr(195).chr(178) => 'o', chr(195).chr(179) => 'o',
  33. chr(195).chr(180) => 'o', chr(195).chr(181) => 'o',
  34. chr(195).chr(182) => 'o', chr(195).chr(184) => 'o',
  35. chr(195).chr(185) => 'u', chr(195).chr(186) => 'u',
  36. chr(195).chr(187) => 'u', chr(195).chr(188) => 'u',
  37. chr(195).chr(189) => 'y', chr(195).chr(190) => 'th',
  38. chr(195).chr(191) => 'y', chr(195).chr(152) => 'O',
  39. // Decompositions for Latin Extended-A
  40. chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
  41. chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
  42. chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
  43. chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
  44. chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
  45. chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
  46. chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
  47. chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
  48. chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
  49. chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
  50. chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
  51. chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
  52. chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
  53. chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
  54. chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
  55. chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
  56. chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
  57. chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
  58. chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
  59. chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
  60. chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
  61. chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
  62. chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
  63. chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
  64. chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
  65. chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
  66. chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
  67. chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
  68. chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
  69. chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
  70. chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
  71. chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
  72. chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
  73. chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
  74. chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
  75. chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
  76. chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
  77. chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
  78. chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
  79. chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
  80. chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
  81. chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
  82. chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
  83. chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
  84. chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
  85. chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
  86. chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
  87. chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
  88. chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
  89. chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
  90. chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
  91. chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
  92. chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
  93. chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
  94. chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
  95. chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
  96. chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
  97. chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
  98. chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
  99. chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
  100. chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
  101. chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
  102. chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
  103. chr(197).chr(190) => 'z', chr(197).chr(191) => 's',
  104. // Decompositions for Latin Extended-B
  105. chr(200).chr(152) => 'S', chr(200).chr(153) => 's',
  106. chr(200).chr(154) => 'T', chr(200).chr(155) => 't',
  107. // Euro Sign
  108. chr(226).chr(130).chr(172) => 'E',
  109. // GBP (Pound) Sign
  110. chr(194).chr(163) => '',
  111. // Vowels with diacritic (Vietnamese)
  112. // unmarked
  113. chr(198).chr(160) => 'O', chr(198).chr(161) => 'o',
  114. chr(198).chr(175) => 'U', chr(198).chr(176) => 'u',
  115. // grave accent
  116. chr(225).chr(186).chr(166) => 'A', chr(225).chr(186).chr(167) => 'a',
  117. chr(225).chr(186).chr(176) => 'A', chr(225).chr(186).chr(177) => 'a',
  118. chr(225).chr(187).chr(128) => 'E', chr(225).chr(187).chr(129) => 'e',
  119. chr(225).chr(187).chr(146) => 'O', chr(225).chr(187).chr(147) => 'o',
  120. chr(225).chr(187).chr(156) => 'O', chr(225).chr(187).chr(157) => 'o',
  121. chr(225).chr(187).chr(170) => 'U', chr(225).chr(187).chr(171) => 'u',
  122. chr(225).chr(187).chr(178) => 'Y', chr(225).chr(187).chr(179) => 'y',
  123. // hook
  124. chr(225).chr(186).chr(162) => 'A', chr(225).chr(186).chr(163) => 'a',
  125. chr(225).chr(186).chr(168) => 'A', chr(225).chr(186).chr(169) => 'a',
  126. chr(225).chr(186).chr(178) => 'A', chr(225).chr(186).chr(179) => 'a',
  127. chr(225).chr(186).chr(186) => 'E', chr(225).chr(186).chr(187) => 'e',
  128. chr(225).chr(187).chr(130) => 'E', chr(225).chr(187).chr(131) => 'e',
  129. chr(225).chr(187).chr(136) => 'I', chr(225).chr(187).chr(137) => 'i',
  130. chr(225).chr(187).chr(142) => 'O', chr(225).chr(187).chr(143) => 'o',
  131. chr(225).chr(187).chr(148) => 'O', chr(225).chr(187).chr(149) => 'o',
  132. chr(225).chr(187).chr(158) => 'O', chr(225).chr(187).chr(159) => 'o',
  133. chr(225).chr(187).chr(166) => 'U', chr(225).chr(187).chr(167) => 'u',
  134. chr(225).chr(187).chr(172) => 'U', chr(225).chr(187).chr(173) => 'u',
  135. chr(225).chr(187).chr(182) => 'Y', chr(225).chr(187).chr(183) => 'y',
  136. // tilde
  137. chr(225).chr(186).chr(170) => 'A', chr(225).chr(186).chr(171) => 'a',
  138. chr(225).chr(186).chr(180) => 'A', chr(225).chr(186).chr(181) => 'a',
  139. chr(225).chr(186).chr(188) => 'E', chr(225).chr(186).chr(189) => 'e',
  140. chr(225).chr(187).chr(132) => 'E', chr(225).chr(187).chr(133) => 'e',
  141. chr(225).chr(187).chr(150) => 'O', chr(225).chr(187).chr(151) => 'o',
  142. chr(225).chr(187).chr(160) => 'O', chr(225).chr(187).chr(161) => 'o',
  143. chr(225).chr(187).chr(174) => 'U', chr(225).chr(187).chr(175) => 'u',
  144. chr(225).chr(187).chr(184) => 'Y', chr(225).chr(187).chr(185) => 'y',
  145. // acute accent
  146. chr(225).chr(186).chr(164) => 'A', chr(225).chr(186).chr(165) => 'a',
  147. chr(225).chr(186).chr(174) => 'A', chr(225).chr(186).chr(175) => 'a',
  148. chr(225).chr(186).chr(190) => 'E', chr(225).chr(186).chr(191) => 'e',
  149. chr(225).chr(187).chr(144) => 'O', chr(225).chr(187).chr(145) => 'o',
  150. chr(225).chr(187).chr(154) => 'O', chr(225).chr(187).chr(155) => 'o',
  151. chr(225).chr(187).chr(168) => 'U', chr(225).chr(187).chr(169) => 'u',
  152. // dot below
  153. chr(225).chr(186).chr(160) => 'A', chr(225).chr(186).chr(161) => 'a',
  154. chr(225).chr(186).chr(172) => 'A', chr(225).chr(186).chr(173) => 'a',
  155. chr(225).chr(186).chr(182) => 'A', chr(225).chr(186).chr(183) => 'a',
  156. chr(225).chr(186).chr(184) => 'E', chr(225).chr(186).chr(185) => 'e',
  157. chr(225).chr(187).chr(134) => 'E', chr(225).chr(187).chr(135) => 'e',
  158. chr(225).chr(187).chr(138) => 'I', chr(225).chr(187).chr(139) => 'i',
  159. chr(225).chr(187).chr(140) => 'O', chr(225).chr(187).chr(141) => 'o',
  160. chr(225).chr(187).chr(152) => 'O', chr(225).chr(187).chr(153) => 'o',
  161. chr(225).chr(187).chr(162) => 'O', chr(225).chr(187).chr(163) => 'o',
  162. chr(225).chr(187).chr(164) => 'U', chr(225).chr(187).chr(165) => 'u',
  163. chr(225).chr(187).chr(176) => 'U', chr(225).chr(187).chr(177) => 'u',
  164. chr(225).chr(187).chr(180) => 'Y', chr(225).chr(187).chr(181) => 'y',
  165. // Vowels with diacritic (Chinese, Hanyu Pinyin)
  166. chr(201).chr(145) => 'a',
  167. // macron
  168. chr(199).chr(149) => 'U', chr(199).chr(150) => 'u',
  169. // acute accent
  170. chr(199).chr(151) => 'U', chr(199).chr(152) => 'u',
  171. // caron
  172. chr(199).chr(141) => 'A', chr(199).chr(142) => 'a',
  173. chr(199).chr(143) => 'I', chr(199).chr(144) => 'i',
  174. chr(199).chr(145) => 'O', chr(199).chr(146) => 'o',
  175. chr(199).chr(147) => 'U', chr(199).chr(148) => 'u',
  176. chr(199).chr(153) => 'U', chr(199).chr(154) => 'u',
  177. // grave accent
  178. chr(199).chr(155) => 'U', chr(199).chr(156) => 'u',
  179. );
  180. // Used for locale-specific rules
  181. $locale = get_locale();
  182. if ( 'de_DE' == $locale || 'de_DE_formal' == $locale ) {
  183. $chars[ chr(195).chr(132) ] = 'Ae';
  184. $chars[ chr(195).chr(164) ] = 'ae';
  185. $chars[ chr(195).chr(150) ] = 'Oe';
  186. $chars[ chr(195).chr(182) ] = 'oe';
  187. $chars[ chr(195).chr(156) ] = 'Ue';
  188. $chars[ chr(195).chr(188) ] = 'ue';
  189. $chars[ chr(195).chr(159) ] = 'ss';
  190. } elseif ( 'da_DK' === $locale ) {
  191. $chars[ chr(195).chr(134) ] = 'Ae';
  192. $chars[ chr(195).chr(166) ] = 'ae';
  193. $chars[ chr(195).chr(152) ] = 'Oe';
  194. $chars[ chr(195).chr(184) ] = 'oe';
  195. $chars[ chr(195).chr(133) ] = 'Aa';
  196. $chars[ chr(195).chr(165) ] = 'aa';
  197. }
  198. $string = strtr($string, $chars);
  199. } else {
  200. $chars = array();
  201. // Assume ISO-8859-1 if not UTF-8
  202. $chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)
  203. .chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)
  204. .chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202)
  205. .chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210)
  206. .chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218)
  207. .chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227)
  208. .chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235)
  209. .chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243)
  210. .chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251)
  211. .chr(252).chr(253).chr(255);
  212. $chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";
  213. $string = strtr($string, $chars['in'], $chars['out']);
  214. $double_chars = array();
  215. $double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));
  216. $double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');
  217. $string = str_replace($double_chars['in'], $double_chars['out'], $string);
  218. }
  219. return $string;
  220. }