Discussion:
Sobre el idioma de la consola. Mostrando eñes ;)
(demasiado antiguo para responder)
wastedyears
2005-11-15 19:05:25 UTC
Permalink
Hola a todos los ñuseros,
Estoy haciendo una aplicación de consola en C, bajo el entorno MS
Visual Studio 2003. Mi problema es que la consola muestra mal
caracteres como "¿", "ñ", y las letras acentuadas... esta vez no
puedo pasar sin ello porque el programa debe quedar verdaderemente bien
presentado...
Agradecería cualquier pista o cualquier ayuda...

Saludos!
Pedro Maicas
2005-11-15 23:56:32 UTC
Permalink
Post by wastedyears
Estoy haciendo una aplicación de consola en C, bajo el entorno MS
Visual Studio 2003. Mi problema es que la consola muestra mal
caracteres como "¿", "ñ", y las letras acentuadas... esta vez no
puedo pasar sin ello porque el programa debe quedar verdaderemente bien
presentado...
Podríes editar el texto con un editor msdos, en el
propio windows tienes uno (EDIT.COM), las eñes que escribas
con este editor saldrán correctamente al compilar (por contra
las veras mal en windows, en el visual studio).

Otra alternativa es, editar el fuente en windows y
antes de sacarlo en pantalla traducir cada strig usando
la funcion CharToOem (mira la ayuda de esta funcion)

Saludos :-) -Pedro-

http://www.maicas.net/

e-mail en www.maicas.net
Antoine Leca
2005-11-16 10:24:17 UTC
Permalink
Post by wastedyears
Estoy haciendo una aplicación de consola en C, bajo el entorno MS
Visual Studio 2003. Mi problema es que la consola muestra mal
caracteres como "¿", "ñ", y las letras acentuadas...
¿Estas ejecutando en Windows NT (2000, XP, Vista), o con 9x?

En el primer caso, creo que con

SetConsoleOutputCP(1252);

lo tindrás solucionado. También hay

SetConsoleCP(1252);

para entender mejor lo que se teclee...

Son variables globales de la consola, por lo cual una vez que esta hecho, el
estado no cambia hasta que se cierre la ventana (o otra llamada, claro).
Se puede cambiar desde el mismo CMD.EXE, con el mando CHCP.


Antoine
wastedyears
2005-11-16 22:58:08 UTC
Permalink
Uso windows XP, pero el programa rulará también sobre w2000.
Precisamente mi mensaje iba por ahí, esperaba una instruccion que
cambiara algun parametro de las variables de entorno, como se hace en
linux...

El caso es que ninguna de las dos opciones me funciona correctamente...
Lo comprobaré de igual modo.

Muchísimas gracias :)
Zara
2005-11-17 10:45:59 UTC
Permalink
On 16 Nov 2005 14:58:08 -0800, "wastedyears"
Post by wastedyears
Uso windows XP, pero el programa rulará también sobre w2000.
Precisamente mi mensaje iba por ahí, esperaba una instruccion que
cambiara algun parametro de las variables de entorno, como se hace en
linux...
El caso es que ninguna de las dos opciones me funciona correctamente...
Lo comprobaré de igual modo.
Muchísimas gracias :)
Mira en msdn.microsoft.com la función CharToOem y sus parientes. Son
justo lo que necesitas

Saludos (no respondí antes por un fallo generalizado del PC #@%!)

-- Zara
Antoine Leca
2005-11-18 13:10:21 UTC
Permalink
[UTF-8]
Post by wastedyears
El caso es que ninguna de las dos opciones me funciona
correctamente... Lo comprobaré de igual modo.
¿Sería mucho pedir que nos enseñarías algunos líneas de código?

Por ejemplo,

int __stdcall SetConsoleOutputCP(unsigned);
int __stdcall SetConsoleCP(unsigned);

int main() {
puts("¿esas ñ?");
SetConsoleOutputCP(1252);
puts("¿esas ñ?");
return 0;
}

me da

┐esas ±?
¿esas ñ?


lo que al mi parecer resuelve tu problema.
Y si hago

CHCP 1252

antes (es decir, en un CMD.EXE «virgen») antes de ejecutar el problema, me
da

¿esas ñ?
¿esas ñ?

o sea, que ha ejecutado el equivalente del SetConsoleOutputCP antes, y no da
problemas ninguno.



Antoine
wastedyears
2005-11-19 16:52:45 UTC
Permalink
Hola, Antoine, ante todo gracias por tu ayuda...
Yo ejecuto este código (desde el VStudio o bien en una consola abierta

#include <stdio.h>
#include <windows.h>

int __stdcall SetConsoleOutputCP(unsigned);
int __stdcall SetConsoleCP(unsigned);

int main(int argc, char* argv[])
{
puts("¿esas ñ?");
SetConsoleOutputCP(1252);
puts("¿esas ñ?");
Sleep(3000);

return 0;
}

Y obtengo en cualquier caso:
+esas ±?
+esas ±?

Antes ya probé moviendo las funciones estas de todas las formas y
maneras, pero no he podido... Por defecto mi consola tiene activa la
página de códigos 850. Lo he comprobado y es efectivamente la
internacional, así que las ñ etc deberían mostrarse correctamente
sin ningun cambio...

Feedback > De momento, lo que he hecho es esto (y funciona, aunque es
un gran "apaño")

#define PRINTF(cad) \
{ \
sprintf(aux_vieja, "%s", cad); \
CharToOem(aux_vieja, aux_nueva); \
printf("%s", aux_nueva); \
}
...
char aux_vieja[80]="";
char aux_nueva[80]="";
...
PRINTF("\n\n¿esas eñes?");

Funcionar funciona, pero no me gusta nada nada el apaño... no sé si
alguien sabe a qué puede deberse esta situación y como puedo llevar a
cabo mis malvados propósitos de hacer un programa sintácticamente
correcto :P

Muchas gracias a todos :)
Antoine Leca
2005-11-21 10:33:38 UTC
Permalink
Post by wastedyears
Hola, Antoine, ante todo gracias por tu ayuda...
Yo ejecuto este código (desde el VStudio o bien en una consola abierta
[...]
Post by wastedyears
+esas ±?
+esas ±?
Antes ya probé moviendo las funciones estas de todas las formas y
maneras, pero no he podido... Por defecto mi consola tiene activa la
página de códigos 850.
Que es lo normal, y debemos _cambiarlo_ a 1252.

Primero, averigua que tienes una fuente TrueType (p.e. Lucida Console) para
la consola (propriedades de la consola, en el menú sistema de la ventana
negra). Eso de cambiar no va bién con une «fuente de mapa de bits».

Si no, ¿puedes probarlo en Windows 2000?
Estoy a punto de pensar que es una "diferencia" entre los dos; es decir, que
Microsoft habría removido algunas cosas del suporte consola en XP (por
mejorar la compatibilidad con 9x).
Post by wastedyears
Lo he comprobado y es efectivamente la internacional,
Si, lo es, pero la organización de los carácteres sigue la de la original
(437) del PC, es decir el orden «OEM», no el orden «Ansi» que es él que
maneja Windows. Y en eso radica tu problema.
Post by wastedyears
así que las ñ etc deberían mostrarse correctamente sin ningun cambio...
Va ser que no. En 850, la ñ está en posición 164 (0xA4); por eso tienes que
enviar el códiga 164 (como en putchar(164)) para verla.
Pero en programación Windows (o Internet, es decir, como en este mensaje) la
'ñ' está codificada como 241, 0xF1. Y tu programa, si no haces algo, está
haciendo el equivalente de putchar(241)...

Por eso, o bién modificas tu programa (como te indiquaba Zara o lo
arreglaste) para convertir los 241 en 164 antes de imprimirlos, o bién
mandaste a Windows que lo hagas para tú (con SetConsoleOutputCp); pero en
este ultimo caso, Windows necesita que todo siga en su puesto, y por defecto
(y compatibilidad con lo antiguo), no lo es.



Antoine
wastedyears
2005-11-21 19:23:26 UTC
Permalink
Bien, estoy más despistado de lo que pensaba con el tema este de los
codigos de teclado :'( He hecho algunas comprobaciones y el problema
era el tema del true type. Con la consola en Lucida todo tira como es
debido... deberian avisarlo :P

La cuestion es que la solucion de cambiar la fuente no me satisface,
porque entiendo que como por defecto, las consolas en Windows llevan la
fuente "mapa de bits"... así que desde mi punto de vista eso disminuye
la portabilidad (dependería de cambiar la fuente donde fuera a ser
ejecutado el programa)

Así que de momento, la macro-chapuza :P se queda... Muchísimas
gracias a todos por la ayuda, especialmente a Antoine :)

Un saludo!
Antoine Leca
2005-11-22 11:57:54 UTC
Permalink
Post by wastedyears
Bien, estoy más despistado de lo que pensaba con el tema este de los
codigos de teclado :'(
No pensaba nada. En Usenet tengo como costumbre de dar más información de lo
estrictamente necesario, por que lo normal es que los intercambios son a
veces, entonces la gente no se paran en lo que los dices, a menudo proban
otras cosas...
Post by wastedyears
Con la consola en Lucida todo tira como es debido...
deberian avisarlo :P
Creo que avisarón... en el tiempo de las consolas, es decir, por ¡allá de
los años 93-96!
No puedo encontrar cosas claras al respecte en el MSDN actual.

Encontro http://support.microsoft.com/default.aspx?scid=247815
Post by wastedyears
La cuestion es que la solucion de cambiar la fuente no me satisface,
porque entiendo que como por defecto, las consolas en Windows llevan
la fuente "mapa de bits"... así que desde mi punto de vista eso
disminuye la portabilidad (dependería de cambiar la fuente donde
fuera a ser ejecutado el programa)
A ver. Lo que disminuería sería de cambiar la fuente del cliente, eso sí;
pero no estas obligado a eso: puedes crear un .LNK de consola (hacía
%SYSTEMROOT%\SYSTEM32\CMD.EXE), ígual que el archivo que está en el Menú
Inicio, dónde pondrás Lucida Console como fuente en lugar de la de mapa de
bits. También debe funcionar si lo asocias a tu .EXE en lugar de CMD.EXE (no
comprobado).

Yo mismo tengo el contrario: de normal (en HKLM\SOFTWARE\Microsoft\
Windows\CurrentVersion\MS-DOS Emulation\Font) uso Lucida Console, pero en lo
del menú inicio tengo la de mapa de bits por si acaso.



Antoine

Loading...