Leer/Escribir caracteres especiales del español (acentos, ñ,…) en una aplicación de consola C

publicado por: Anonymous

Estoy tratando de que una aplicación de consola de C recoja (mediante teclado) caracteres especiales del español como acentos, ‘ñ’, etc en un scanf o en gets.

He conseguido que se muestren dichos caracteres correctamente (almacenados en una variable o, directamente, desde el printf) gracias al paquete locale.h. Muestro un ejemplo:

#include <stdio.h>
// Añade paquete de idiomas
#include <locale.h>

int main(void)
{
    // Declaración de variables
    char cadena[254];

    // Establecer el idioma a español
    setlocale(LC_ALL, "spanish");

    // Mostrar correctamente los caracteres especiales del español
    printf("¡Éxito!. Se muestran los caracteres especiales del español.");

    printf("Introduce un string con caracteres especiales: ");
    gets(cadena);

    printf("El string con caracteres especiales que has introducido es: %s", cadena);

    return 0;   
}

pero aún no conseguí que se recojan correctamente con las funciones mencionadas arriba.

¿Alguien sabe cómo hacerlo?

Gracias


EDIT 1:

Haciendo pruebas he observado que:

  • setlocale(LC_ALL, "spanish"); Muestra los caracteres del español correctamente, pero no los recoge desde teclado.
  • setlocale(LC_ALL, "es_ES"); Recoge los caracteres del español correctamente desde teclado, pero no los muestra bien.

solución

He encontrado una solución al problema. Al parecer, este problema sólo aparece en Windows y su consola de comandos.

#include <stdio.h>
// Añade paquete de idiomas
#include <locale.h>
#include <windows.h>

int main(void)
{
    // Declaración de variables
    char cadena[254];

    // Establecer el idioma a español
    setlocale(LC_ALL, "spanish"); // Cambiar locale - Suficiente para máquinas Linux
    SetConsoleCP(1252); // Cambiar STDIN -  Para máquinas Windows
    SetConsoleOutputCP(1252); // Cambiar STDOUT - Para máquinas Windows

    // Mostrar correctamente los caracteres especiales del español
    printf("¡Éxito!. Se muestran los caracteres especiales del español.");

    printf("Introduce un string con caracteres especiales: ");
    gets(cadena);

    printf("El string con caracteres especiales que has introducido es: %s", cadena);

    return 0;   
}

Consiste en cambiar la codificación tanto de entrada como de salida de la consola de windows con los comandos SetConsoleCP() y SetConsoleOutputCP() (para ello es necesario también incluir la cabecera windows.h). Con eso se resuelve el problema. Espero que sea de ayuda a otras personas que tengan el mismo problema que yo.

Un saludo.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *