Quitar acentos de un string

Iniciado por user-marcos, 9 Julio 2015, 23:58 PM

0 Miembros y 1 Visitante están viendo este tema.

user-marcos

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?

Kaxperday

#1
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 (cpp) [Seleccionar]
printf("%d %d %d %d %d", 'á', 'é', 'í', 'ó', 'ú');

La salida es:

-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 (cpp) [Seleccionar]
if(caracter==-31)
{
caracter='a';
}


Edito: o que leches, simplemente:

Código (cpp) [Seleccionar]
if(caracter=='á')
{
caracter='a';
}


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.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

user-marcos


if( cadena == 'á')

no se puede, y ami me sale que las vocales con acento valen dos char

Kaxperday

#3
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 (cpp) [Seleccionar]

string cadena = "hola quiero eliminar los caráceteres acentuados de ésta cadéna";
remove(cadena.begin(), cadena.end(), 'á');
remove(cadena.begin(), cadena.end(), 'é');
remove(cadena.begin(), cadena.end(), 'í');
remove(cadena.begin(), cadena.end(), 'ó');
remove(cadena.begin(), cadena.end(), 'ù');
printf("%s", cadena.c_str());


Salida:

Citarhola quiero eliminar los carceteres acentuados de sta cadna

:xD :xD :xD :xD
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

user-marcos

#4
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.

ivancea96

#5
Código (cpp) [Seleccionar]
void quitarAcentos(std::string &str){
   static const std::string t = "aáàâäeéèêëiíìîïoóòôöuúùûüAÁÀÄEÉÈÊËIÍÌÎÏOÓÒÔÖUÚÙÛÜnññññNÑÑÑÑ";
   static const unsigned char n = 5; // Numero de acentos diferentes (+ base) por vocal
   for(int i=0; i<str.size(); i++){
       size_t pos = t.find(str[i]);
       if(pos!=std::string::npos){
           str[i] = t[(pos/n)*n];
       }
   }
}


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

Stakewinner00

Si el objetivo es que solo haya chars ASCII valdría algo como
Código (cpp) [Seleccionar]
#include <iostream>
#include <string>

int main()
{
 std::string s;
 std::cin >> s;
 for(unsigned c : s)
   if(c < 127)
     std::cout << char(c);
}

ivancea96

Cita de: user-marcos en 10 Julio 2015, 00:22 AM

if( cadena == 'á')

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.

user-marcos

Cita de: ivancea96 en 10 Julio 2015, 00:38 AM
Pasa el error que te lanza, para saber todos los datos.
Eso es lo mismo que hacer
Código (cpp) [Seleccionar]

int n;
if ( n == 5.55)

esta fuera de rango

user-marcos

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


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

Código (cpp) [Seleccionar]

  string s = "áéíóú";
  quitarAcentos(s);
  cout << s;
//salida ->aaa�a�a�a�

Empiezo a pensar que el problema lo tengo en el ordenador, quizá me falte instalar más codificaciones.