[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