Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] tildes y acentuación en c++/linux

Estas en el tema de tildes y acentuación en c++/linux en el foro de C/C++ en Foros del Web. Hola a todos, tengo el sgte problema: Intento hacer un programa que convierte los caracteres de un string en mayúsculas pero cuando se trata de ...
  #1 (permalink)  
Antiguo 14/05/2015, 22:35
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
tildes y acentuación en c++/linux

Hola a todos, tengo el sgte problema:
Intento hacer un programa que convierte los caracteres de un string en mayúsculas pero cuando se trata de convertir ñ o letras con tilde, no me las convierte.

acá muestro el código:

#include <ctype.h>
#include <iostream>
#include <locale>
using namespace std;
int main() {
setlocale (LC_ALL, "spanish");
string s;
cout << "Ingrese una frase hasta '.': " << endl;
getline(cin,s);
for(int x=0;x<s.size();x++){
if(s[x]==char(-92)){
s[x]=char(-91);
}
else
{
s[x]=toupper(s[x]);
}
}
cout << "\n Resultado: " << s;
return 0;
}

y lo que sale en consola:

Ingrese una frase hasta '.':
ñoño

Resultado: ñOñO
RUN FINISHED; exit value 0,; real time: 2s; user: 0ms; system: 0ms

Agradezco cualquier ayuda, saludos
  #2 (permalink)  
Antiguo 17/05/2015, 16:09
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: tildes y acentuación en c++/linux

Alguna ayuda, por favor?? Porque ni idea tengo de dónde empezar, estoy usando linux mint 16 y netbeans para programar con c++.

Agradece cualquier respuesta y ayuda.
  #3 (permalink)  
Antiguo 18/05/2015, 01:00
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: tildes y acentuación en c++/linux

Tanto C como C++ están basados en el alfabeto inglés. Si te fijas verás que el habla inglesa no hace uso de acentos, por lo que las funciones tipo toupper no van a ser capaces de reconocer estas particularidades.

Te toca currarte una función que sea capaz de reconocer estos caracteres para hacer tu la conversión a mano.

Un saludo
  #4 (permalink)  
Antiguo 18/05/2015, 01:02
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: tildes y acentuación en c++/linux

Yo en Ubuntu lo hago de la siguiente manera (trabajando con wstring y sus amiguetes y con el locale "es_ES.utf8") Espero que te sea útil.

Código C++:
Ver original
  1. #include <iostream>
  2. #include <locale>
  3. #include <string>
  4. using namespace std;
  5.  
  6. int main(){
  7. wstring str;
  8. setlocale(LC_ALL,"es_ES.utf8");
  9. wcout << L"Introduce la cadena a poner en mayúsuculas: ";
  10. getline(wcin,str);
  11.  for (size_t i = 0; i < str.length(); i++)
  12.     str[i] = towupper(str.at(i));
  13. wcout << str;
  14.  
  15. }
  #5 (permalink)  
Antiguo 20/05/2015, 13:28
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: tildes y acentuación en c++/linux

Probé el código y me anduvo lo más bien, pero sucede que cuando quiero escribir un texto medio largo y con más de una tilde o ñ me hace esto:

Introduce la cadena a poner en mayúsuculas: pepón patíto
PEP
RUN FINISHED; exit value 0,; real time: 13s; user: 0ms; system: 0ms

Agradezco cualquier ayuda, saludos
  #6 (permalink)  
Antiguo 20/05/2015, 14:01
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: tildes y acentuación en c++/linux

Yo lo ejecuto y no me da el más mínimo error. Pon el código si es que lo has modificado o algo a ver que puede ocurrir


  #7 (permalink)  
Antiguo 20/05/2015, 23:18
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: tildes y acentuación en c++/linux

Gracias por responder, el código lo puse así:

#include <iostream>
#include <locale>
#include <string>
using namespace std;

int main(){
wstring str;
setlocale(LC_ALL,"es_ES.utf8");
wcout << L"Introduce la cadena a poner en mayúsuculas: ";
getline(wcin,str);
for (size_t i = 0; i < str.length(); i++)
str[i] = towupper(str.at(i));
wcout << str;
}

y esta tuve este resultado:

Introduce la cadena a poner en mayúsuculas: pepón pepito tiene un ñú muy pequeñito

RUN FINISHED; exit value 0,; real time: 31s; user: 0ms; system: 0ms

Agradezco cualquier ayuda, saludos
  #8 (permalink)  
Antiguo 21/05/2015, 00:08
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: tildes y acentuación en c++/linux

¿Qué compilador y qué terminal utilizas?. Sí tienes tu distro de linux configurada en Español pon en el setlocale lo siguiente y cogerá la configuración del sistema.

Código C++:
Ver original
  1. setlocale(LC_ALL,"");
  #9 (permalink)  
Antiguo 22/05/2015, 07:26
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: tildes y acentuación en c++/linux

Ahora si me funcionó, mil gracias, acá está el tema

#include <iostream>
#include <locale>
#include <string>
using namespace std;

int main(){
wstring str;
setlocale(LC_ALL,"");
wcout << L"Introduce la cadena a poner en mayúsuculas: ";
getline(wcin,str);
for (size_t i = 0; i < str.length(); i++)
str[i] = towupper(str.at(i));
wcout << str;
}

y lo q pasó x consola:

Introduce la cadena a poner en mayúsuculas: pepón pepito tiene un ñu pequeñito
PEPÓN PEPITO TIENE UN ÑU PEQUEÑITO
RUN FINISHED; exit value 0,; real time: 13s; user: 0ms; system: 0ms

sólo una pregunta q diferencia hay entre wstring y el string común???

Saludos y mil gracias.
  #10 (permalink)  
Antiguo 22/05/2015, 07:48
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: tildes y acentuación en c++/linux

Te explico:
string es una cadena de char.
wstring es una cadena de wchar.


Un char ocupa 1 byte, y por tanto puede codificar hasta 256 caracteres. Sin embargo, el estándar de c++ no obliga a meter los caracteres no propios de C como char, por tanto hay compiladores que no te dan soporte a las letras como la ñ, otros que te ponen los espaciales como caracteres negativas y otros a partir del 128.

wchar es un "cáracter ancho" por decirlo de alguna forma. En sistemas Windows un wchar ocupa 2 bytes, en linux 4 bytes y te permite codificar todos los caracteres extra y towupper te viene con todos las letras de todos los idiomas y sus mayúsculas. Ten en cuenta que esto es sólo un apaño para nada óptimo en programas grandes ya que consumes de 2 a 4 veces más.

A partir de C++11 existen tipos unicode con solo 2 bytes como char16_t y su correspondiente ustring16 y probablemente sea una aproximación más apropiada, pero cómo la gente no es muy dada a actualizar el compilador y había utilizado eso desde hace tiempo y sabía que funcionaba pues decidí ponerte esa solución.

Un saludo.
  #11 (permalink)  
Antiguo 23/05/2015, 10:04
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años
Puntos: 6
Respuesta: tildes y acentuación en c++/linux

Mil gracias.

Etiquetas: char, int, programa, tildes
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:25.