none
Problemas con caracter ASCII 128 (€) RRS feed

  • Pregunta

  • Hola, el valor ASCII perteneciente a € es 128, pero en Visual C++ tengo el problema de que este carácter no se reconoce adecuadamente, estando reconocido como y con el carácter Ç, y lo mismo si escribo el carácter directamente. Entonces cómo puedo escribir y usar el carácter euro.

    Reciba un cordial saludo

     


    Ángel Manuel

    Blog Twitter

    domingo, 16 de enero de 2011 20:10

Respuestas

Todas las respuestas

  • El "\u20AC" es mapeado al 128 del cp1252. Ese debería ser el codepage de tu windows.

    Por ejemplo, el latin1 (iso 8859-1) no lo reconoce. Incluso el caracter 128 es inválido en ese charset.

    Hola, he utilizado el "\u20AC" pero estoy en las mismas, ya que me da Ç en vez de . Gracias por su ayuda.

    Reciba un cordial saludo


    Ángel Manuel

    Blog Twitter

    domingo, 16 de enero de 2011 20:51
  • Supongo que estarás guardando el texto como ansi 1252 (de ahí el mapeo al 128), y luego lo quieres ver en un dos 850.

    El punto es que si lo quieres ver en un charset que no tiene euro, no te lo va a mostrar. No vas a tener la posibilidad de usar la clase Encoding para que te cambie el 128 a lo que corresponda en ese charset.

    Tal vez deberías modificar la herramienta que estás usando para que te muestre el texto en un charset ansi, no uno de DOS.

     

    domingo, 16 de enero de 2011 21:07
  • Hola, pero cómo cambio la codificación en Visual Studio (del código).

    Un cordial saludo


    Ángel Manuel

    Blog Twitter

    domingo, 16 de enero de 2011 21:25
  • ¿No estará usando una fuente Terminal, no? Una fuente de simulación de DOS
    Estoy desarrollando una aplicación de consola, pero quisiera saber como cambiar la codificación. Saludos

    Ángel Manuel

    Blog Twitter

    domingo, 16 de enero de 2011 21:50
  • He cambiado la codificación y estoy en las mismas, y con la codificación "Europeo occidental...1252" no consigo nada ya que no se muestra €, sino Ç siendo 128 el numero asignado a char().

    Lo que quiero que me explique es cómo hacer aparecer ese caracter,

    Un saludo


    Ángel Manuel

    Blog Twitter

    lunes, 17 de enero de 2011 14:14
  • En win32 tienes SetConsoleCP() para setear el codepage de la consola actual. En dotnet, no sé.

    Si yo escribo

    Console::WriteLine("€€€€€€");

    compilo, abro la consola de window en donde corre el interprete de comandos, tipeo chcp 1252 y luego, desde esa consola invoco mi programa, el output me muestra el euro...

     

    lunes, 17 de enero de 2011 14:54
  • Pues no se puede mostrar el carácter ya que ASCII no lo incluye, sino el estándar ISO ya que entendí mal lo indicado en http://www.ascii.cl/htmlcodes.htm donde como se puede ver, ASCII no incluye €.

    En segundo lugar, se puede utilizar en C++ dicho caracter mediante Unicode (siendo de éste algunas líneas que me dio) pero Windows Console no soporta éste, así que los caracteres >=128 son mostrados como los extra de ASCII.

    Saludos y gracias por la ayuda.


    Ángel Manuel

    Blog Twitter

    lunes, 17 de enero de 2011 16:28
  • Yo compilo una aplicación de win32 con

     SetConsoleOutputCP(1252);

     printf("%c", 128);

    y veo el símbolo del euro... según la KB, la fuente en la consola tiene que ser monoespaciada y unicode truetype. Supongo que el tipo hará la cuenta 128 del 1252 = u+20ac

    lunes, 17 de enero de 2011 17:33
  • Hola, pero como le he dicho, WINDOWS CONSOLE no lo soporta (unicode) aunque no ha cometido errores de código.

    Gracias


    Ángel Manuel

    Blog Twitter

    lunes, 17 de enero de 2011 18:11
  • El problema no está ahi, y creo que no se puede cambiar localmente mientras sea un programa de "consola" puro.

    El cambio hay que hacerlo en la configuración global del ordenador para programas no-unicode, que suele estar en la tercera pestaña de las configuraciones regionales.

    En .NET va porque .NET es unicode por defecto y la consola abre CMD.exe, y entonces se compila todo como unicode y se elige la página de códigos correcta. Todo eso lo hace .NET antes de abrir la consola, y si queremos hacerlo nosotros en nativo, hay que hacerlo a mano.

    Los problemas con las conolas y unicodes son amplios. Primero necesitas que la fuente de la consola sea unicode, tienes que ajustar la página de códigos si no, y luego está el tema ANSI/OEM con las páginas de códigos, que viene a decir que el mismo código char no se corresponde con la misma "letra" según estés en windows o en consola...

    Finalmente, para salir a consola con Unicode, tienes que usar las funciones "anchas" (wide) y usar wchar_t como caracteres. Por ejemplo, para cout, es "wcout", y lo mismo para las funciones de C. Todo eso viene en la referencia de cada función. Y sólo si tu programa es un programa "amigo". Si escribes directamente en memoria de vídeo, o usas alguna llamada rara, automáticamente se lanza el command.com y olvídate de unicode en la consola.

     


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    • Editado RFOGModerator martes, 18 de enero de 2011 11:30 ampliar
    martes, 18 de enero de 2011 11:19
    Moderador
  • Hola, me puede explicar de qué modo puedo utilizar wprintf() ya que lo he hecho como en  printf("%c", 128); reemplazando printf por wprintf() pero me da error.

    ¿Cómo la utilizo y todo para mostrar los caracteres en UNICODE, porque ni estas líneas me sirven:

    SetConsoleCP(65001);

    SetConsoleOutputCP(65001);

    Saludos


    Ángel Manuel

    Blog Twitter

    martes, 18 de enero de 2011 15:07
  • Lo primero es:

    wprintf(L"%c", 128); 

    Porque las cadenas Unicode vienen definidas pur una L delante. Fíjate en el ejemplo de la MSDN: http://msdn.microsoft.com/en-us/library/wc7014hz(v=vs.80).aspx

    Para lo otro, debes llamar así SetConsoleOutputCP(CP_UTF8);

    http://msdn.microsoft.com/en-us/library/ms686036(v=vs.85).aspx

    http://support.microsoft.com/kb/99795

    De todos modos el runtime de Visual C++ no anda muy fino con las cosas Unicode.


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    martes, 18 de enero de 2011 16:10
    Moderador
  • Hola, pues lo he hecho como me ha dicho y la consola sigue dándole Ç en vez de €. Ya no sé qué hacer, es que ASCII es el único conjunto de caracteres soportado por Windows Console ya que no hay manera de que soporte Unicode.

    Gracias por toda su ayuda.

    Reciba un cordial saludo.


    Ángel Manuel

    Blog Twitter

    martes, 18 de enero de 2011 21:26
  • No, no es el único conjunto. El problema creo que está en que el editor está usando la página de códigos ANSI y la consola, una OEM. La fuente de la consola también debe soportar UNICODE, no sé qué fuente tendrás por defecto. Y que el runtime de Visual C++ para consola no anda muy fino en temas Unicode...

    En el API hay dos funciones que se llaman AnsiToOem() y OemToAnsi() para traducir cadenas. Podrías intentar usarlas.

    De todos modos, a ver si mañana saco algo de tiempo y hago un proyecto de ejemplo y lo pongo por aquí...

    Cuando estás con textos no unicode, el valor del char para el € del editor del visual studio es el Ç. Y el € de la consola en el editor será cualquier otro caracter. Prueba a imprimir todos los caracteres del 32 al 255 y mira por dónde te sale el símbolo del euro. Imprime el valor numérico y es ese el que tienes que poner en el editor. Por lo menos así sales del paso, hasta que consiga yo un ejemplo funcional (si lo consigo).


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    martes, 18 de enero de 2011 21:50
    Moderador
  • Hola, finalmente solucioné mi problema cambiando la fuente de la consola.

    Saludos


    Ángel Manuel

    Blog Twitter

    jueves, 20 de enero de 2011 14:27
  • Es una cosa de las que te dije que podía ser.

    He preguntado y me han dicho que la consola y el runtime de C de Visual C++ (y ya de paso otros runtimes de otros compiladores) no soportan muy bien el tema de UNICODE, pero me han dado varios enlaces, por si te interesan:

    http://blog.kalmbachnet.de/?postid=98

    http://msdn.microsoft.com/en-us/library/3e22ty2t

    http://blogs.msdn.com/b/michkap/archive/2010/10/07/10072032.aspx
    http://blogs.msdn.com/b/michkap/archive/2008/03/18/8306597.aspx

    Voy a mirarme yo esto en detalle y si saco algo en limpio, publicaré una entrada en mi blog.

     


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    jueves, 20 de enero de 2011 16:03
    Moderador
  • Hola, esto estará un poco obsoleto, pero sólo indicar que el símbolo del euro no es el alt+128 (que efectivamente es la Ç) sino alt+0128 (€)
    miércoles, 14 de noviembre de 2012 9:34
  • Hola.

    Supongo que será una aplicación de consola, y en ese caso la única solución es buscar el código del símbolo euro en la página de códigos en la que se abra la consola.

    Hace muchos años que no manejo todo eso, pero creo que la 437 que es la USA no lo trae, pero la 850 que es la europea sí. Busca por internet las tablas de caracteres ASCII por página de código y mira a ver.

    Eso más que un problema de desarrollo es de configuración de la consola.


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/

    miércoles, 14 de noviembre de 2012 10:35
    Moderador
  • Hola, tardisima mi respuesta pero la posteo por si alguno otro le sirve, el error es que no es el valor 128 si no 0128

    parece una tonteria pero no es un numero comun, sin el cero es otra cosa.

    saludos


    Neurus

    jueves, 14 de noviembre de 2013 19:14
  • Amigo usa el valor ASCII 0128 (con el 0 adelante y te funcionará sin problemas)

    Saludos!

    miércoles, 16 de julio de 2014 12:39
  • yo también tengo el mismo problema marco Alt 128 y me sale otra cosa. Pero lo solucioné más rápido que tú.

    ¡¡¡ EL SÍMBOLO DEL EURO LO BUSQUÉ POR INTERNET, LO ENCONTRÉ AL TOQUE, LO 'SOMBREÉ', LE DÍ 'CONTROL+C' Y LUEGO LO PEGUÉ CON 'CONTROL+V' ... Y LISTO, SE ACABÓ TANTA COSA ... Y NO ME TIRÉ DOS DÍAS PREGUNTÁNDO Y JOROBANDO LA PASIENCIA A TODO EL PLANETA POR QUE TU BENDITO TECLADO OBSOLETO NO LO TIENE CONFIGURADO. YA PUÉS, NO TE PASES, PERO IGUAL ME SIMPATIZÓ MUCHO 'TU PREGUNTITA'.

    CORDIALES SALUDOS DESDE LIMA - PERÚ



    martes, 2 de agosto de 2016 12:34