Resumo de programação Unicode
Para aproveitar o suporte em tempo de execução para Unicode da MFC e C, você precisa:
Definir
_UNICODE
.Definir o símbolo de
_UNICODE
antes de criar seu programa.Especificar o ponto de entrada.
Na página Avançado da pasta Vinculador na caixa de diálogo das Páginas de Propriedades do projeto, defina o símbolo Ponto de Entrada como
wWinMainCRTStartup
.Usar funções e tipos em tempo de execução portáteis.
Use as funções em tempo de execução C adequadas para tratar cadeia de caracteres Unicode. Você pode usar a família de funções
wcs
, mas talvez prefira as macros_TCHAR
, totalmente portáteis (habilitadas internacionalmente). Essas macros são todas prefixadas com_tcs
; elas substituem, uma por uma, a família de funçõesstr
. Essas funções são descritas detalhadamente na seção Internacionalização da Referência da Biblioteca de Runtime. Para obter mais informações, consulte Mapeamentos de texto genérico em tchar.h.Usar
_TCHAR
e os tipos de dados portáteis relacionados, descritos em Suporte para Unicode.Manipular cadeias de caracteres literais corretamente.
O compilador do Visual C++ interpreta uma cadeia de caracteres literal codificada como:
L"this is a literal string"
uma cadeia de caracteres Unicode. Você pode usar o mesmo prefixo para caracteres literais. Use a macro
_T
para codificar cadeias de caracteres literais genericamente, para que elas sejam compiladas como cadeias de caracteres Unicode em Unicode, ou, como cadeias de caracteres ANSI (incluindo MBCS) sem Unicode. Por exemplo, em vez de:pWnd->SetWindowText( "Hello" );
use:
pWnd->SetWindowText( _T("Hello") );
Com
_UNICODE
definido,_T
converte a cadeia de caracteres literal para o formulário com prefixo L; caso contrário,_T
converte a cadeia de caracteres sem o prefixo L.Dica
A macro
_T
é idêntica à macro_TEXT
.Tenha cuidado ao passar comprimentos de cadeia de caracteres para funções.
Algumas funções esperam o número de caracteres em uma cadeia de caracteres; outras esperam o número de bytes. Por exemplo, se
_UNICODE
for definida, a chamada a seguir para um objetoCArchive
não funcionará (str
é umCString
):archive.Write( str, str.GetLength( ) ); // invalid
Em um aplicativo Unicode, o comprimento fornece o número de caracteres, mas não o número correto de bytes, porque cada caractere tem 2 bytes de largura. Em vez disso, você deve usar:
archive.Write( str, str.GetLength( ) * sizeof( _TCHAR ) ); // valid
que especifica o número correto de bytes a serem gravados.
No entanto, as funções membro do MFC que são orientadas a caracteres, em vez de orientadas a bytes, funcionam sem essa codificação extra:
pDC->TextOut( str, str.GetLength( ) );
CDC::TextOut
usa o número de caracteres, não o número de bytes.Usar fopen_s, _wfopen_s para abrir arquivos Unicode.
Para resumir, o MFC e a biblioteca de tempo de execução fornecem o seguinte suporte para programação Unicode:
Exceto para funções membro da classe de banco de dados, todas as funções MFC são habilitadas para Unicode, incluindo
CString
.CString
também fornece funções de conversão Unicode/ANSI.A biblioteca de runtime fornece versões Unicode de todas as funções de tratamento de cadeia de caracteres. (A biblioteca de runtime também fornece versões portáteis adequadas para Unicode ou para MBCS. São as macros
_tcs
).A tchar.h fornece tipos de dados portáteis e a macro
_T
para traduzir caracteres e cadeias de caracteres literais. Para obter mais informações, consulte Mapeamentos de texto genérico em tchar.h.A biblioteca de runtime fornece uma versão de caractere largo de
main
. Usewmain
para tornar seu aplicativo com reconhecimento Unicode.