Sono d'accordo con Sascha. La premessa alla base di TCHAR/ _T()/ ecc. È che puoi scrivere un'applicazione basata su "ANSI" e quindi fornirle magicamente il supporto Unicode definendo una macro. Ma questo si basa su diversi presupposti sbagliati:
Che crei attivamente entrambe le versioni MBCS e Unicode del tuo software
In caso contrario, sarà scivolare e utilizzare normali char*stringhe in molti luoghi.
Che non usi caratteri di escape con barra rovesciata non ASCII nei letterali _T ("...")
A meno che la codifica "ANSI" non sia ISO-8859-1, i valori letterali char*e risultanti wchar_t*non rappresenteranno gli stessi caratteri.
Quelle stringhe UTF-16 vengono utilizzate proprio come le stringhe "ANSI"
Loro non sono. Unicode introduce diversi concetti che non esistono nella maggior parte delle codifiche di caratteri legacy. Surrogati. Combinare i personaggi. Normalizzazione. Regole di maiuscole / minuscole condizionali e dipendenti dalla lingua.
E forse la cosa più importante, il fatto che UTF-16 viene raramente salvato su disco o inviato su Internet: UTF-8 tende ad essere preferito per la rappresentazione esterna.
Che la tua applicazione non utilizza Internet
(Ora, questo potrebbe essere un presupposto valido per il tuo software, ma ...)
Il web gira su UTF-8 e una pletora di codifiche più rare . Il TCHARconcetto ne riconosce solo due: "ANSI" (che non può essere UTF-8 ) e "Unicode" (UTF-16). Può essere utile per rendere le tue chiamate API Windows compatibili con Unicode, ma è dannatamente inutile per rendere le tue app Web e di posta elettronica compatibili con Unicode.
Che non usi librerie non Microsoft
Nessun altro usa TCHAR. Poco utilizza std::stringe UTF-8. SQLite ha le versioni UTF-8 e UTF-16 della sua API, ma no TCHAR. TCHARnon è nemmeno nella libreria standard, quindi no a std::tcoutmeno che tu non voglia definirlo tu stesso.
Quello che raccomando invece di TCHAR
Dimentica che esistono le codifiche "ANSI", tranne quando devi leggere un file che non è valido UTF-8. Dimentica TCHARanche tu . Chiama sempre la versione "W" delle funzioni API di Windows. #define _UNICODEsolo per assicurarti di non chiamare accidentalmente una funzione "A".
Usa sempre le codifiche UTF per le stringhe: UTF-8 per le charstringhe e UTF-16 (su Windows) o UTF-32 (su sistemi Unix-like) per le wchar_tstringhe. typedef UTF16e UTF32tipi di carattere per evitare differenze di piattaforma.