Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas con expat y la iso-8859-1

Iniciado por javiel, 17 de Abril de 2007, 02:39:59 PM

« anterior - próximo »

javiel

Hola:

Ya se que esto no está relacionado con videojuegos, aunque es por un videojuego por lo que tengo el problema ;-)

Estoy desesperado y no se donde preguntar

La cosa es que tengo un XML con los diferentes idiomas del juego y tengo un clase en C++ que contiene el diccionario. Con expat leo el XML y lo paso a al diccionario de la instanacia. La cosa es que uso iso-8859-1 pero no me pilla los acentos, la ñ y todo eso

Me estoy volviendo loco. Llevo tres días mirando y modificando el código pero es imposible. Si le paso una string con acentos me lo hace bien, pero si le paso un string que he pillado el XML no me lo hace

Tengo el archivo XML, los archivos .cpp y .h con la codificacion iso-8859-1. El XML lo tengo con encoding="iso-8859-1" y cuando cargo en el XML_Parser de expat también le pongo iso-8859-1. Yo es que creo que no hay más

Lo he probado en linux y windows y en los dos no me funciona.

Lo más raro es que los caracteres especiales me lo pilla como si fueran dos caracteres. El texto se lo paso a una clase que me crea la palabra desde una fuente bitmap. Para ello voy leyendo cada uno de los caracteres, pero los especiales son dos números negativos

Por ejemplo, si pusiera:

"gráfico"

serías algo como:

3 (g) 10 (r) -21 -23 (á) 34 (f) 24 (i) 45 (c) 12 (o)

los números me los he inventado

Bueno, cualquier cosa a lo mejor me orienta hacer nuevas pruebas, pq ya no se me ocurre nada más

¿alguna idea?

gracias de antemano
uper-Tirititran: el superhéroe gaditano (http://www.super-tirititran.com)

josepzin

No tengo idea cual es la solución, pero me solidarizo...

Ayer estuve varias horas renegando por lo mismo pero con una web...

alberizo

jeje yo ya desistí del UTF-8 y quedarme con el ISO-8859-1 para la web, aunque no es el futuro, por lo menos no terminas cagandote en la [mode_censured=on]blable ble blo blablió[mode_censured=off]

nose, yo tampoco se como solucionarlo, así a bote pronto se me ocurré que sustituyas los caractes especiales por su equivalente en HTML
ñ => &_#241; (sin el guión)

josepzin

Cita de: "alberizo"jeje yo ya desistí del UTF-8 y quedarme con el ISO-8859-1 para la web, aunque no es el futuro, por lo menos no terminas cagandote en la [mode_censured=on]blable ble blo blablió[mode_censured=off]
puf.. no me digas... ayer era una especie de callejón sin salida...

Si ponia UTF-8, los textos de las bases de datos y archivos PHP/HTML salian mal (a convertir todo), si ponia ISO-8859-1 entonces Eclipse no me permitía usar el simbolo Euro... y asi estuve un rato entre ir y venir hasta que descubrí el ISO-8859-15, que incluye el Euro y demás.

Supongo que lo mejor sería usar UTF-8... espero no tener problemas en el futuro... :S

Perdon por la offtopicación...

gdl

Lo que yo hago (hasta ahora con buen resultado) es pasar de wide char strings (WCS) a multi byte string (MBS) mediante una función de la CRT (wcstombs) de forma que se ajusta directamente a la página de códigos que esté usando el sistema operativo. Lo único que necesitarías es pasar del código que tengas en el XML al WCS que tengas (generalmente la primera página del UNICODE). En definitiva, algo como:


XML (¿UTF-8?) ------->  WCS (UNICODE primera) ---------> MBS (Que use el S.O.)

Espero que te sirva de ayuda.

Edit y PD: Creo recordar que XML permite usar directamente UNICODE con lo que te ahorrarías el primer paso y, además, podrías usar las funciones del S.O. de WC directamente ahorrándote el wcstombs. Aunque esto no lo he probado.

javiel

estoy probando lo del WCS y eso, pero no me funciona. No se si lo estoy haciendo bien

Yo lo que tengo una clase (singleton) llamada Languge que tiene un diccionario con las palabras traduciodas del idioma. El diccionario es una "map" con dos "string", uno con el nombre y otro el valor

Cuando llamo a getText me devuelve el valor del nombre, pero lo que me devuelve es el string. Se supone que el diccionario está en unico ya que lo relleno a partir del XML que está en unicode

Total, que a la funciona wcstombs, tiene que darle el segundo parámetro en unicode en el tipo (const wchar_t*). A lo máximo que he llegado es hacer un casting, pero cuando escribo lo que pone, que está en la variable tmp que es un char de 32, no me sale lo que debería se salir

es muy posible que no lo esté haciendo bien

¿me puedes orientar con esto a ver si funciona? Muchas gracias, te pongo el código


char tmp[32];
const wchar_t* w = (const wchar_t*)Language::GetInstance()->getText("nombre").c_str();
wcstombs(tmp, w, sizeof(tmp));
uper-Tirititran: el superhéroe gaditano (http://www.super-tirititran.com)

gdl

Generalmente las cadenas de STL son de chars y no de wide chars, así que es extraño que el casting a lo bravo te sirva de algo. Me interesa ver el contenido de las cadenas del diccionario en hex (para ver la codificación que tienen). Para que te hagas una idea es probable que estés en la parte de arriba que yo he llamado XML. Los pasos que quedan por hacer son:

1) Averiguar qué charset y qué codificación te devuelve el XML.
2) Convertir esa codificación a UNICODE UCS2. Eso es lo que dije con la breve frase "Lo único que necesitarías es pasar del código que tengas en el XML al WCS que tengas", pero puede que sea la parte más difícil.
3) Una vez que tengas el WCS, usar el wcstombs.

Por lo que veo estás saltando directamente al paso 3.

Ahora que es fin de semana y tengo algo de tiempo voy a echarle una ojeada al Expat a ver qué charset y codificación usa.

gdl

Vaya, esto fue rápido. He encontrado este interesante post.

Lo que te dice es que da igual la codificación del fichero XML o lo que pases a XML_Parser, el Expat lee esa codificación y te da como salida UTF-8 o UTF-16. Si es UTF-16 lo que haces arriba debería funcionar (a excepción del cero final de dos bytes que podría darte problemas de memoria). Si es UTF-8 has de convertirlo antes a wide char. Como no te ha funcionado, supongo que te devuelte UTF-8. Así que el paso dos de lo dicho arriba es una conversión UTF-8 -> UCS-2.

Espero que des con la tecla :-)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.