[C con Clase] c y unicode
Steven Davidson
srd4121 en njit.edu
Vie Sep 3 09:11:24 CEST 2010
Hola Adolfo,
On 9/2/2010 7:27 PM, Adolfo Cárdenas wrote:
>
>
> El 2 de septiembre de 2010 15:02, Adolfo Cárdenas <adocardenas en gmail.com
> <mailto:adocardenas en gmail.com>> escribió:
>
>
>
> Gracias, he logrado mostrar el caracter haciendo una pequeña variación
> La primera parte esigual:
>
> HFONT hf = CreateFont(
> -MulDiv(14, GetDeviceCaps(hdc, LOGPIXELSY), 72),0,
> 0,0,
> FW_NORMAL, FALSE, FALSE, FALSE,
> CHINESEBIG5_CHARSET, OUT_TT_PRECIS,
> CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
> DEFAULT_PITCH | FF_DONTCARE, TEXT("MingLiu") );
> HFONT hfPrev = (HFONT) SelectObject( hdc, hf );
> Luego:
> En vez de colocar TEXT( "\x81a1" );
> he colocado(he tenido que colocar)
> TCHAR szMensaje[] = TEXT( "\xa1\x81" );
> ¿Tal vez es asunto del compilador?
> o es que no estoy usando en #define UNICODE(porque uso TextOutW)
>
> El problema no es no colocar #define UNICODE ya probe,ademas tambien
> no quero perder el manejo de cadenas normales.
>
Sí y no. Tienes que tener en cuenta el tipo de dato que estás usando
para interpretar correctamente la información que guardas. No es lo
mismo guardar el número hexadecimal 0x81A1 en una variable con un tipo
que ocupa 2 bytes que dos números hexadecimales 0xA1 y 0x81 de un tipo
que ocupa 1 byte, consecutivamente en 2 bytes. Por ejemplo,
unsigned short int var = 0x81A1;
unsigned char *ptr = (unsigned char *)(&var);
cout << hex << var << endl;
cout << hex << (unsigned int)ptr[0] << ','
<< (unsigned int)ptr[1] << endl;
Aparecerá en pantalla:
81a1
a1,81
Se trata de la misma información, por el tema que expliqué de los
procesadores de Intel: la ordenación de los bytes se basa en guardar al
principio el byte menos importante.
> y en vez de
> TextOut( oohdc, 50,110, (WCHAR*)szMensaje, n-1 );
> uso
> TextOutW( oohdc, 50,110, (WCHAR*)szMensaje, n-2 );
> gracias.
>
> Me gustaria ver la estructura o la definicion de TCHAR, no la encontre
> en windows.h ni en winuser.h
>
La definición está en <WinNT.h> y es simplemente:
#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;
#endif
Espero haber aclarado un poco más el tema.
Steven
Más información sobre la lista de distribución Cconclase