[C con Clase] Varias dudas del curso

JoseL joselubar en gmail.com
Lun Nov 26 22:37:11 CET 2007


El pasado 2007-11-22 22:03:36, David Reza escribió:

DR> 2.- En mis programas (de consola) no salen los acentos, ya que salen otras
DR> letras que sustituyen a las vocales con acentos.
DR> ¿Cómo puedo hacer que se visualicen correctamente los acentos?


Hola David. Acabo de empezar el curso y tu post me ha resultado muy útil para aclarar muchas cosas. Pronto plantearé mis primeras dudas. Mientras tanto me gustaría comentar algo sobre el problema de las eñes y las vocales acentuadas. Yo pensaba que la consola sencillamente era incapaz de mostrar estos caracteres y no le dí mayor importancia. Pero al ejecutar un programa repleto de errores me fijé que entre un montón de símbolos extraños también se mostraban algunos caracteres propios del castellano. Así que escribí un pequeño programita para imprimir todos los caracteres posibles:

#include <iostream>
using namespace std;

int main()
{	
	char c;
	for (int i=16;i<=255;i++)
	{
		c = i;
		if(i<100) cout << " ";
		cout << i << " = " << c;
		if((i+1)%8) cout << "   "; else cout << endl;
	}
	cin.get();
	return 0;
}

El resultado es este:

http://img145.imageshack.us/img145/9927/asciihz0.jpg

Comprobé que con los correspondientes valores en octal y hexadecimal se podían utilizar secuencias de escape para imprimir esos caracteres:

'ñ' = '\244' = '\xA4'
'Ñ' = '\245' = '\xA5'
'á' = '\240' = '\xA0'
'é' = '\202' = '\x82'
'í' = '\241' = '\xA1'
'ó' = '\242' = '\xA2'
'ú' = '\243' = '\xA3'
'Á' = '\265' = '\xB5'
'É' = '\220' = '\x90'
'Í' = '\326' = '\xD6'
'Ó' = '\340' = '\xE0'
'Ú' = '\351' = '\xE9'
'ü' = '\201' = '\x81'
'Ü' = '\232' = '\x9A'

Al menos, con Windows XP. Por ejemplo, las frases:

	"España está en la península ibérica.
	Álava, Guipúzcoa y Castellón son bilingües."

Se puede mostrar en la consola de esta manera:

#include <iostream>
using namespace std;

int main()
{	
	cout << endl;
	cout << "Espa\244a est\240 en la pen\241nsula ib\202rica." << endl;
	cout << "\265lava, Guip\243zcoa y Castell\242n son biling\201es.";
	
	cout << endl << endl;		// o bien:
	
	cout << "Espa\xA4\x61 est\xA0 en la pen\xA1nsula ib\x82rica." << endl;
	cout << "\xB5lava, Guip\xA3zcoa y Castell\xA2n son biling\x81\x65s.";

	cin.get();
	return 0;
}

Fíjate que en caso de que utilices la notación hexadecimal, si detrás de una secuencia de escape tienes que mostrar la letra a, b, c, d, e o f, también tienes que utilizar para éstas una secuencia de escape, porque sino el compilador las considera como parte de la secuencia de escape anterior y da un warning "hex escape sequience out of range". Es el caso de "España" (Espa\xA4\x61) y "bilingüe" (biling\x81\x65)

Espero que te sirva de ayuda. Saludos.



Más información sobre la lista de distribución Cconclase