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 TCHAR
concetto 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::string
e UTF-8. SQLite ha le versioni UTF-8 e UTF-16 della sua API, ma no TCHAR
. TCHAR
non è nemmeno nella libreria standard, quindi no a std::tcout
meno 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 TCHAR
anche tu . Chiama sempre la versione "W" delle funzioni API di Windows. #define _UNICODE
solo per assicurarti di non chiamare accidentalmente una funzione "A".
Usa sempre le codifiche UTF per le stringhe: UTF-8 per le char
stringhe e UTF-16 (su Windows) o UTF-32 (su sistemi Unix-like) per le wchar_t
stringhe. typedef
UTF16
e UTF32
tipi di carattere per evitare differenze di piattaforma.