elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Utilizar setlocale( ) para ingresar caracteres especiales con cin
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Utilizar setlocale( ) para ingresar caracteres especiales con cin  (Leído 10,550 veces)
snoopty

Desconectado Desconectado

Mensajes: 86


Ver Perfil
Utilizar setlocale( ) para ingresar caracteres especiales con cin
« en: 8 Septiembre 2021, 10:36 am »

Hola a todos !
Acaso es posible lograr lo que describo en " ASUNTO " ... ? ; En todo caso, existe otra función que nos permita evitar escribir Código ASCII o ASCII extendido dentro de un IO scanf/printf ??
El siguiente Código no me funciona :

#include <iostream>
#include <clocale>

using namespace std;

int main()
{

setlocale(LC_ALL, "spanish");
char c;


cout<<"Ingrese la Letra ' EñE ' "<<endl;
cin>>c;
cout<<"Ingresaste la  "<<c<<endl;

return(0);
}

/* Gracias por leer el mensaje */


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Utilizar setlocale( ) para ingresar caracteres especiales con cin
« Respuesta #1 en: 8 Septiembre 2021, 11:12 am »

¿Estas en Windows?
Código
  1. setlocale(LC_ALL, "es-ES");

https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/setlocale-wsetlocale
https://docs.microsoft.com/en-us/cpp/c-runtime-library/language-strings


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
snoopty

Desconectado Desconectado

Mensajes: 86


Ver Perfil
Re: Utilizar setlocale( ) para ingresar caracteres especiales con cin
« Respuesta #2 en: 9 Septiembre 2021, 00:30 am »

Gracias. Pero no, tengo la PC en bucle con Pantalla Azul al arrancar.....( ¿ Dev-C++ Embarcadero; o cualquier .cpp y su .exe generado pudieron haber generado esta Imposibilidad de arranque ?? ) estoy desde Apps Cxx y Dcoder ( Android ) y no funciona.
Existe algo de esto para las Apps ( ? )
Saludos !
En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Utilizar setlocale( ) para ingresar caracteres especiales con cin
« Respuesta #3 en: 9 Septiembre 2021, 01:00 am »

Gracias. Pero no, tengo la PC en bucle con Pantalla Azul al arrancar.....( ¿ Dev-C++ Embarcadero; o cualquier .cpp y su .exe generado pudieron haber generado esta Imposibilidad de arranque ?? )
Mira qué error arroja el BSOD... ese texto que aparece como:
*** STOP: 0x000... (0x0..., 0x0..., 0x0..., 0x0...)
En google puedes buscarlo, y te señalará las más que probables causas (que te ayuden a repararlo), típicamente (en estos casos) es un fichero dañado que el S.O. precisa para arrancar, menos frecuente suele ser un cambio de configuración. Pero si el problema te apareció justo al hacer pruebas con tu código, va a ser lo primero...
En realidad es conveniente preguntar en los propios foros de Microsoft, pues la diversidad de detalles pueden escapar a la solución específica que a alguien le funcionó.
En línea

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Utilizar setlocale( ) para ingresar caracteres especiales con cin
« Respuesta #4 en: 9 Septiembre 2021, 01:01 am »

Siempre es un dolor de cabeza trabajar con localización, sobre todo en Windows. No está mal como lo estabas haciendo, pero debes asegurarte de que la consola use la misma codificación. Cuando usas "Spanish" o "es-ES" para el locale, en realidad es como si pusieras "Spanish_Spain.1252". O sea estás configurando el código de página ANSI 1252, pero, si no recuerdo mal, la consola usa una codificación OEM, por lo que eñes y acentos no van a salir bien. Necesitas cambiar también la consola:

Código
  1. setlocale(LC_ALL, "es-ES");
  2. /* O bien
  3. setlocale(LC_ALL, "Spanish_Spain");
  4. o
  5. setlocale(LC_ALL, "Spanish_Spain.1252");
  6. */
  7.  
  8. // Cambia la salida
  9. SetConsoleOutputCP(1252);
  10.  
  11. // Y la entrada
  12. SetConsoleCP(1252);
  13.  

Sin embargo, aunque ahora mismo no tengo donde probarlo, estoy casi seguro de que la fuente que usaba por defecto la consola en Windows 7 no tenía eñes ni acentos para esa codificación, por lo que si quieres que funcione en esa versión o anteriores debes asegurarte de cambiarla.

Alternativamente, puedes poner el locale a OEM:
Código
  1. // O "Spanish_Mexico.850", "Spanish_Argentina.850", etc
  2. setlocale(LC_ALL, "Spanish_Spain.850");
  3. // Es buena idea asegurarse de que la consola esté igual
  4. SetConsoleOutputCP(850);
  5. SetConsoleCP(850);
  6.  

esto me parece que no tiene el problema de las fuentes en versiones anteriores de Windows, pero es más recomendable la forma anterior.

Esto aplica para los valores que se muestran y leen en la consola, pero no significa que los caracteres especiales que escribas en tu código se muestren correctamente. Eso depende de la codificación que use el editor con el que lo escribes, por lo que es muy mala idea usar este tipo de caracteres en el código (si lo abres en otro editor, o en el mismo editor pero en otra máquina o sesión, te lo va a descomponer). Una forma más portable es usar sus valores numéricos:

Código
  1. //Para ANSI 1252
  2. cout << "Ingrese la Letra 'E""\xF1""E'" << endl;
  3. //Para OEM 850
  4. cout << "Ingrese la Letra 'E""\xA4""E'" << endl;
  5.  

hay formas mucho mejores de manejar la localización, pero también son más complicadas. Para cosas simples yo creo que con esto basta.
En línea

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Utilizar setlocale( ) para ingresar caracteres especiales con cin
« Respuesta #5 en: 9 Septiembre 2021, 01:42 am »

Gracias. Pero no, tengo la PC en bucle con Pantalla Azul al arrancar.....( ¿ Dev-C++ Embarcadero; o cualquier .cpp y su .exe generado pudieron haber generado esta Imposibilidad de arranque ?? ) estoy desde Apps Cxx y Dcoder ( Android ) y no funciona.
Existe algo de esto para las Apps ( ? )
Saludos !

No vi eso. Lo que te puse aplica sólo para Windows. No sé cómo sea la terminal de Android que uses, pero se usa UTF-8 igual que en Linux, por lo que quizás algo así te pudiera funcionar:


Código
  1. setlocale(LC_ALL, "es-ES.UTF-8")
  2. wcin.imbue(locale("es-ES.UTF-8"));
  3. wcout.imbue(locale("es-ES.UTF-8"));

Y usarías las funciones y tipos "wide" para manejar texto. En lugar de cout, cin, string y char, usarías wcout, wcin, wstring, wchar_t, etc. Pero yo nunca trabajo de esta manera en la terminal, así que no sé si te sirva.

Pensándolo mejor, aunque usar las funciones wide hace más explícito el hecho de que en Unicode los caracteres pueden ocupar varios bytes (lo cual pensé que te podría evitar errores), creo que al final podría ser más confuso, por lo que igual puedes aplicar el imbue a cin y cout y seguir usándolos sin tener que lidiar con wcout y demás. De cualquier forma, no deberás usar variables char simples sino arreglos char o directamente string, aún si únicamente quieres leer un solo caracter.
« Última modificación: 9 Septiembre 2021, 03:08 am por RayR » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Utilizar setlocale( ) para ingresar caracteres especiales con cin
« Respuesta #6 en: 9 Septiembre 2021, 07:50 am »

Gracias. Pero no, tengo la PC en bucle con Pantalla Azul al arrancar.....( ¿ Dev-C++ Embarcadero; o cualquier .cpp y su .exe generado pudieron haber generado esta Imposibilidad de arranque ?? )

Es muy poco probable pero sin analizar un volcado de memoria es imposible saber la razon de la excepcion no controlada en modo Kernel que lo genero. Fijate si podes entrar en modo a prueba de fallos para empezar, de no ser posible usa la consola de recuperacion, y trata de encontrar el volcado de memoria (es un archivo %SystemRoot%\MEMORY.DMP o un directorio %SystemRoot%\Minidump). Lo podes abrir con el WinDbg (Debugging Tools for Windows hoy en dia viene con el SDK de Windows).
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Caracteres especiales
PHP
chicuela66 2 2,884 Último mensaje 12 Enero 2007, 14:25 pm
por 5n4K3
caracteres especiales
Scripting
flony 0 2,514 Último mensaje 1 Junio 2010, 03:27 am
por flony
Letras para MSN - caracteres especiales ASCII
Software
granulia 1 3,704 Último mensaje 3 Julio 2011, 00:53 am
por SuperDraco
Ayuda: ¿Caracteres especiales con PHP?
Desarrollo Web
Argentino Canejo 3 3,923 Último mensaje 8 Octubre 2012, 02:21 am
por ~ Yoya ~
regex para filtrar caracteres especiales en jquery
Desarrollo Web
gAb1 2 3,821 Último mensaje 20 Abril 2016, 16:28 pm
por gAb1
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines