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
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
Edito: o que leches, simplemente: Código
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 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
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
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
Título: Re: Quitar acentos de un string Publicado por: ivancea96 en 10 Julio 2015, 00:38 am Código 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 hacerCódigo 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
EDITO: La A mayúscula con acento circulflejo (^) no se ve. Acuerdate de añadirla si usas este código. Código 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
¿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 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 compiladorTí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 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
Título: Re: Quitar acentos de un string Publicado por: ivancea96 en 10 Julio 2015, 01:33 am Código
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 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
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
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
|