Eu tenho que concordar com Sascha. A premissa subjacente de TCHAR
/ _T()
/ etc. é que você pode escrever um aplicativo baseado em "ANSI" e, em seguida, magicamente dar a ele suporte Unicode definindo uma macro. Mas isso se baseia em várias suposições erradas:
Que você construa ativamente as versões MBCS e Unicode de seu software
Caso contrário, você vai escorregar e usar comuns char*
cordas em muitos lugares.
Que você não use escapes de barra invertida não ASCII em literais _T ("...")
A menos que sua codificação "ANSI" seja ISO-8859-1, o resultado char*
e os wchar_t*
literais não representarão os mesmos caracteres.
Que strings UTF-16 são usadas como strings "ANSI"
Eles não são. O Unicode apresenta vários conceitos que não existem na maioria das codificações de caracteres legados. Substitutos. Combinando personagens. Normalização. Regras de capitalização condicionais e sensíveis ao idioma.
E talvez o mais importante, o fato de que UTF-16 raramente é salvo em disco ou enviado pela Internet: UTF-8 tende a ser preferido para representação externa.
Que seu aplicativo não usa a Internet
(Agora, esta pode ser uma suposição válida para o seu software, mas ...)
A web roda em UTF-8 e uma infinidade de codificações mais raras . O TCHAR
conceito reconhece apenas dois: "ANSI" (que não pode ser UTF-8 ) e "Unicode" (UTF-16). Pode ser útil para tornar suas chamadas de API do Windows compatíveis com Unicode, mas é absolutamente inútil para tornar seus aplicativos de web e de email compatíveis com Unicode.
Que você não use bibliotecas que não sejam da Microsoft
Ninguém mais usa TCHAR
. Poco usa std::string
e UTF-8. SQLite tem versões UTF-8 e UTF-16 de sua API, mas não TCHAR
. TCHAR
nem mesmo está na biblioteca padrão, então não, a std::tcout
menos que você mesmo queira definir.
O que eu recomendo em vez de TCHAR
Esqueça que existem codificações "ANSI", exceto quando você precisar ler um arquivo que não é UTF-8 válido. Esqueça TCHAR
também. Sempre chame a versão "W" das funções da API do Windows. #define _UNICODE
apenas para ter certeza de não chamar acidentalmente uma função "A".
Sempre use codificações UTF para strings: UTF-8 para char
strings e UTF-16 (no Windows) ou UTF-32 (em sistemas do tipo Unix) para wchar_t
strings. typedef
UTF16
e UTF32
tipos de personagens para evitar diferenças de plataforma.