Autor Tema: Problemas con "é"  (Leído 267 veces)

Arcontus

  • Sr. Member
  • ****
  • Mensajes: 266
  • Karma: 9
Problemas con "é"
« en: Noviembre 25, 2017, 08:21:06 pm »
Para solventar el problema de los acentos ñ's y demás simbolos de nuestro teclado al utilizar los FNT, he hecho una funcion que recibiendo un array de chars revisa caracter a caracter y sustituye los simbolos no standards encontrados por su correspondiente simbolo para el FNT. Este es el código y ejecutable de ejemplo:
Código: [Seleccionar]
import "mod_key"
import "mod_map"
import "mod_video"
import "mod_text"
import "mod_screen"
import "mod_string"

PROCESS normalize_special_chars(char *myNonStandardChar,int size)
PRIVATE
    int index;
END
BEGIN
    for (index = 0; index < size; index++)
        if (myNonStandardChar[index] == "ñ")
            myNonStandardChar[index] = chr(241);
        END
        if (myNonStandardChar[index] == "Ñ")
            myNonStandardChar[index] = chr(209);
        END
        if (myNonStandardChar[index] == "á")
            myNonStandardChar[index] = chr(225);
        END
        if (myNonStandardChar[index] == "Á")
            myNonStandardChar[index] = chr(193);
        END
        /* // Char 101 corresponde al simbolo é del sistema. en este caso devuelve un caracter extraño
        if (myNonStandardChar[index] == 101)
            myNonStandardChar[index] = chr(233);
        END
        */
        // el if anterior y este corresponden al mismo simbolo pero devuelven diferente comporsizeiento. En este caso devuelve ú
        if (myNonStandardChar[index] == "é")
            myNonStandardChar[index] = chr(233);
        END
        if (myNonStandardChar[index] == "É")
            myNonStandardChar[index] = chr(201);
        END
        if (myNonStandardChar[index] == "í")
            myNonStandardChar[index] = chr(237);
        END
        if (myNonStandardChar[index] == "Í")
            myNonStandardChar[index] = chr(205);
        END
        if (myNonStandardChar[index] == "ó")
            myNonStandardChar[index] = chr(243);
        END
        if (myNonStandardChar[index] == "Ó")
            myNonStandardChar[index] = chr(211);
        END
        if (myNonStandardChar[index] == "ú")
            myNonStandardChar[index] = chr(250);
        END
        if (myNonStandardChar[index] == "Ú")
            myNonStandardChar[index] = chr(218);
        END
        if (myNonStandardChar[index] == "ç")
            myNonStandardChar[index] = chr(231);
        END
        if (myNonStandardChar[index] == "Ç")
            myNonStandardChar[index] = chr(199);
        END
        if (myNonStandardChar[index] == "¡")
            myNonStandardChar[index] = chr(161);
        END
        if (myNonStandardChar[index] == "¿")
            myNonStandardChar[index] = chr(191);
        END
    END
END

Process Main()
PRIVATE
    char myNonStandardChar[30];
    string mySTR, txt;
    int myFont;
    int index;
    char asc[1];
END
Begin
    myNonStandardChar = "áéíóú, ÁÉÍÓÚ, ñÑ, Çç, ¿¡!?"; //El segundo simbolo no se pinta correctamente
    set_mode(1024,768,32);
    myFont = load_fnt("fuente.fnt");  //<---- cambiad aquí por vuestra fuente .FNT
    normalize_special_chars(&myNonStandardChar,len(myNonStandardChar));
    mySTR = myNonStandardChar;
    write_string(myFont,200,200,0,&mySTR);
    asc[0] = chr(233);  // Test del simbolo 233, que es el que está dando problemas.
    txt = asc;
    write_string(myFont,200,230,0,&txt); //Aqui se pinta perfectamente el simbolo "é"
    while(!(key(_esc)))
        frame;
    END
END
Pues bien, por algún extraño motivo que no alcanzo a comprender, é no se traduce correctamente. Además, hay un if comentado en la funcion normalize_special_chars(), si se descomenta ese if y se comenta el del simbolo "é", el resultado sigue siendo incorrecto pero cambia.
Por último, en la función main justo antes de la instruccion while imprimo una string con el contenido que debería tener la cadena anterior y en este caso funciona.


¿Teneis alguna idea de que está sucediendo?¿Os pasa tambien a vosotros el problema al traducir la "é"?
Un ultimo apunte, la librería ttf de la wiki no funciona. No pinta ningún tipo de texto, por ello me he visto forzado a traducir los chars para utilizar FNT.
Cualquier ayuda será bien recibida.
« última modificación: Noviembre 25, 2017, 09:18:42 pm por Arcontus »

Drumpi

  • Hero Member
  • *****
  • Mensajes: 6269
  • Karma: 159
  • Odio el periodo "entre proyectos"
    • La web de Drumpi
Re:Problemas con "é"
« Respuesta #1 en: Noviembre 26, 2017, 12:48:42 am »
Te lo tendría que mirar, pero creo que en lugar de usar "é" deberías usar 'é', con comillas simples, porque si no recuerdo mal, Bennu toma los datos entre comillas dobles como strings, y entre comillas simples como char.
No obstante, estás usando un pointer a un array de chars. Recomendaría que, si sigue fallando, intentases usar constantes, o funciones tipo ATOI, CHR o no recuerdo cuáles eran los que convertían a CHAR (lo siento, uso demasiados lenguajes recientemente y tengo un pequeño cacao mental).

Respecto a la ttf, la wiki está desactualizada desde... no lo sé ^^U Busca las descargas oficiales, a ver si anda por ahí, y si no, L1nk3rn3l seguro que tiene un enlace al BennuPack, donde estará la librería actualizada y compilada a la última versión disponible ;)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Arcontus

  • Sr. Member
  • ****
  • Mensajes: 266
  • Karma: 9
Re:Problemas con "é"
« Respuesta #2 en: Noviembre 26, 2017, 09:09:01 am »
Hola Drumpi, gracias por tu rápida respuesta. Lo curioso del tema es que solo falla en la representación de un carácter concreto (siempre el mismo, "é"), por lo que me decanto  a pensar que Bennu está haciendo algo más con ese char que se me escapa.

Respecto a " " en vez de ' ', tiene sentido lo que dices, pero al realizar una comparación entiendo que lo que cuenta es el código ascii. De todas maneras, como podéis ver hay un IF comentado que en vez de comparar con "é" compara con su valor ascii (el 101). Si se descomenta este caso y se comenta el caso de la comparación con la "é", que debería dar el mismo resultado en una comparación y la otra, pues no, ninguna de las dos funciona correctamente y ademas dan resultados erroneos distintos.

Agradecería que algún experto corriera este programa con una fuente que tenga disponible y diga si se le representa bien el carácter 'é'.
Gracias de antemano,Un saludo!

panreyes

  • Administrator
  • *****
  • Mensajes: 2141
  • Karma: 73
    • panreyes.com
Re:Problemas con "é"
« Respuesta #3 en: Noviembre 26, 2017, 07:15:42 pm »

Arcontus

  • Sr. Member
  • ****
  • Mensajes: 266
  • Karma: 9
Re:Problemas con "é"
« Respuesta #4 en: Noviembre 26, 2017, 10:38:16 pm »

panreyes

  • Administrator
  • *****
  • Mensajes: 2141
  • Karma: 73
    • panreyes.com
Re:Problemas con "é"
« Respuesta #5 en: Noviembre 26, 2017, 11:35:32 pm »
Prueba también a hacer un say, a ver si te salen las tildes correctas.

También, ¿con qué programa generas los FNT?
Me suena que hace tiempo tenían una opción para guardarlos en CP850 o en UTF8, o algo parecido.

¿Has probado a reordenar los bitmaps del FNT? Yo los tengo ordenados así para que me funcionen correctamente con la solución que di en el otro hilo:
https://www.dropbox.com/s/uh390ezh2twce3e/h4.zip?dl=0

Arcontus

  • Sr. Member
  • ****
  • Mensajes: 266
  • Karma: 9
Re:Problemas con "é"
« Respuesta #6 en: Noviembre 28, 2017, 12:19:43 pm »
Gracias Panreyes,

no pude hacer las pruebas a fondo hasta ahora. El problema estaba en la codificación de la fuente, fue ponerle CP850 y todo a funcionar como la seda.
Karma++

panreyes

  • Administrator
  • *****
  • Mensajes: 2141
  • Karma: 73
    • panreyes.com
Re:Problemas con "é"
« Respuesta #7 en: Noviembre 28, 2017, 12:23:28 pm »
Me alegro, un problema menos :)

Luego te contesto el hilo de Steam, que no he tenido momento aún.