C y C++ son lenguajes americanos, por lo tanto están pensados para mostrar y/o ingresar texto en inglés, y este carece de acentos, de signo de apertura de exclamación o de interrogación, letras acentuadas, por esa razón a todos esos caracteres con esta característica los toma como símbolos, el compilador de C y C++ los ve como símbolos. Eso ocurre también con demás caracteres y letras en otros idiomas distintos al inglés, como letras con circunflejo, con cedilla, o con cualquier símbolo fonético sobre una letra o debajo de esta que no pertenezca al alfabeto inglés.
Situación problema:Queremos colocar, por ejemplo, la u con tilde para que en tiempo de ejecución se muestre, por ejemplo, la palabra "número", pero cuando ejecutamos por pantalla nos queda "n-mero", palabra con falta.
Para colocar tildes y demás letras con algún tipo de acentuación en el texto que se quiere mostrar en tiempo de ejecución se debe hacer lo siguiente:
Por identificador de variable carácter:Una de las formas de colocar tildes y demás acentos es utilizar un identificador de variables del tipo carácter y colocar al final el código ASCII de dicho carácter:
Ej.:
- Código:
-
printf("Hay un %crbol, que mat%c a un colibr%c.",160,162,161);
Donde %c es el identificador de variable, en este caso c de carácter, y 160 que es el código ASCII del símbolo á
Otros símbolos:
á:
- Código:
-
printf("%c",160);
é:
- Código:
-
printf("%c",130);
í:
- Código:
-
printf("%c",161);
ó:
- Código:
-
printf("%c",162);
ú
- Código:
-
printf("%c",163);
ñ:
- Código:
-
printf("%c",164);
º:
- Código:
-
printf("%c",248);
¡:
- Código:
-
printf("%c",173);
¿:
- Código:
-
printf("%c",168);
Por código hexadecimal:Otra forma que tenemos para colocar tildes es la siguiente:
Usamos la siguiente fórmula:
\xnn
donde \ en este caso es el carácter que le indica a C++ que vamos a colocar una expresión de llamado, x de hexadecimal y nn es el número en hexadecimal del carácter ASCII correspondiente a dicho símbolo.
Ej.:
Buscamos en código ASCII correspondiente al símbolo "ú" que es 163. Luego, ese código lo convertimos a hexadecimal que sería a3 y lo ponemos sustituyendo en la fórmula al nn y nos queda \xa3. Esto le ordena a C que llame al código ASCII en hexadecimal y cargue el símbolo en tiempo de ejecución.
Esto lo colocamos sustituyendo el símbolo por su correspondiente en la palabra que contenga el símbolo
Ej.: en tiempo de diseño queda así: n\xa3mero
Compilamos y en tiempo de ejecución nos queda "número"
Otros símbolos:
á:
- Código:
-
printf("\xA0");
é:
- Código:
-
printf("\x82");
í:
- Código:
-
printf("\xA1");
ó:
- Código:
-
printf("\xA2");
ú
- Código:
-
printf("\xA3");
ñ:
- Código:
-
printf("\xA4");
Letras mayúsculas:
Ó
- Código:
-
printf("\xE0");
Ú
- Código:
-
printf("\xE9");
Símbolo de grado:
º:
- Código:
-
printf("\xF8");
¡:
- Código:
-
printf("\xAD");
¿:
- Código:
-
printf("\xA8");
Conflictos de carácter:
Pueden existir conflictos de carácter, cuando el compilador interpreta la siguiente letra de la palabra como parte del código hexadecimal, esa secuencia no se corresponde con ningún símbolo ASCII, y el compilador de C o C++ no entiende a que símbolo queremos llamar, por eso muestra la siguiente advertencia en el mensaje de construcción: warning: hex escape sequence out of range (advertencia: secuencia hex [hexadecimal] fuera de rango).
Este error se puede solventar realizando dos printf donde en el primero se deja la palabra a medias (cai-->ca\xA1) y el siguiente se iniciaría con el resto de la(s) palabra(s) sin utilizar un \n.
Ej:
- Código:
-
printf("No existe ra\xA1");
- Código:
-
printf("ces reales");
otra forma de escribir lo mismo sería:
- Código:
-
printf("No existe ra\xA1"), printf("ces reales");
Concatenamos una cadena de texto con el llamado al símbolo con la otra cadena de texto con el carácter, que es un y de concatenación para que se muestren concatenados ambas cadenas de texto en el tiempo de ejecución.
Otra forma de corregir este error es poner la expresión \xnn entre comillas dobles:
- Código:
-
printf("No existen ""ra\xA1""ces reales");
De estas dos formas se evitan los posibles conflictos de carácter que ocurren en C y C++
Por símbolo que devuelven letras acentuadas:También existen ciertos símbolos que el compilador de C y C++ los interpreta como letras acentuadas o con chiu:
á:
- Código:
-
printf(" "); //(nbsp -espacio sin separación-, este espacio especial se despliega en pantalla escribiendo alt+255)
Á
- Código:
-
printf("µ"); //(mi -letra griega minúscula-, esta letra griega se despliega en pantalla escribiendo alt+230)
é:
- Código:
-
printf(""); //(no conozco símbolo ascii que devuelva una é)
í:
- Código:
-
printf("¡"); //escribir signo de apertura de exclamación
ó:
- Código:
-
printf("¢"); //El símbolo ¢ se despliega en pantalla escribiendo alt+189
ú:
- Código:
-
printf("£"); //El símbolo £ se despliega en pantalla escribiendo alt+156
ñ:
- Código:
-
printf("¤"); //El símbolo ¤ se despliega en pantalla escribiendo alt+207
Símbolo de grado:
º:
- Código:
-
printf("§"); //El símbolo ø se despliega en pantalla escribiendo alt+0167
¡:
- Código:
-
printf(""); //(no conozco símbolo que devuelva un ¡)
¿:
- Código:
-
printf("¨"); //El símbolo ¨ (diéresis) se despliega en pantalla escribiendo alt+249
Mediante librería:Hay una librería que se puede utilizar para que se puedan interpretar por consola correctamente los signos que
escribimos en el procesador de texto, llamada locale e indicándole en el main el idioma con que escribimos.
1) Declaramos la librería locale.h, por ejemplo después del último #include
2) Configuramos el idioma que queremos utilizar para escribir los textos, en este caso español escribiendo lo siguiente dentro del main:
- Código:
-
setlocale(LC_CTYPE, "Spanish");
En caso de que querer utilizar otro idioma, sustituimos Spanish por el nombre en inglés del idioma que queremos
utilizar, sin importar ni las mayúsculas ni las minúsculas.
Ejemplo:
- Código:
-
#include <stdio.h>
#include <locale.h>
int main()
{
setlocale(LC_CTYPE, "Spanish");
printf("Hay un árbol que mató a un colibrí");
return 0;
}
Y de esta forma los símbolos se interpretan correctamente en consola.