[eside-ghost] Duda de wxString

Borja Bacaicoa borja en juantxo.net
Vie Sep 2 15:16:48 CEST 2005


Hola Txipi,

> y al ejecutarlo, el std::string me hace bien la llamada a c_str() y me
> escribe "/home/prueba", pero el wxString me devuelve solamente el
> primer caracter r:-?

Creo que el problema reside en que estás mezclando cadenas basadas en
charsets ANSI (Latin, etc) con cadenas Unicode.

Verás, dependiendo de con qué flags estés compilando el código, o qué
flags vengan habilitados por defecto en las wx, las cadenas que dicha
librería usa internamente pueden ser ANSI (basadas en charset) o
Unicode.

Cuando escribes esta sentencia:

	wxString filename = wxT("/home/prueba");

si las wx tienen puesto el flag de ANSI, lo que tendrás en filename será
una cadena donde cada byte representará un caracter (vamos, basado en
charsets ANSI). Si en cambio está habilitado el #define de Unicode, en
filename tendrás una cadena Unicode, en el formato de transformación que
sea (UTF-8/16/32).

Siguiendo con el código, cuando haces esto otro:

	printf("%s",filename.c_str());

Resulta que la función c_str() se comporta diferente de si ha sido
compilada con ANSI o Unicode, devolviendo:

	ANSI -> const char*
	Unicode -> const wchar_t*

Y resulta que si miras la especificación de la función printf(),
mediante el parámetro %s lo que espera como entrada es char*, y no
wchar_t*, porque la printf sólo sirve para cadenas ANSI.

Lo que pienso, por tanto, que está sucediendo, es que estás usando las
wx con #define Unicode, y estás pasándole una cadena Unicode a la
printf, que sólo entiende de cadenas ANSI.

Como prueba chorra de concepto, si cambias la línea anterior por esto:

	wprintf("%s",filename.c_str());

y te funciona, entonces has hallado el problema, porque la wprintf sí
entiende de cadenas Unicode :)

Un saludo y a ver si te sirve de ayuda!!!

Borja.





Más información sobre la lista de distribución eside-ghost