Je suis d'accord avec Sascha. Le postulat sous-jacent TCHAR
/ _T()
/ etc. est que vous pouvez écrire un "ANSI"-fondé sur l'application et puis comme par magie lui donner le support de l'Unicode par la définition d'une macro. Mais ceci est basé sur plusieurs hypothèses erronées:
Que vous activement à construire à la fois MBCS et Unicode versions de vos logiciels
Sinon, vous permettra de glisser vers le haut et l'utilisation ordinaire, char*
chaînes dans de nombreux endroits.
Que vous n'utilisez pas de caractères non ASCII des antislashes dans _T("...") littéraux
À moins que votre "ANSI" encoding arrive à être en ISO-8859-1, le résultat en char*
et wchar_t*
des littéraux de ne pas présenter les mêmes caractères.
Que UTF-16 chaînes sont utilisées comme "ANSI" les chaînes
Ils ne sont pas. Unicode introduit plusieurs concepts qui n'existent pas dans la plupart de l'héritage des codages de caractères. Les mères porteuses. Les combinaisons de caractères. La normalisation. Conditionnelle et de la langue-sensible règles de casse.
Et peut-être plus important encore, le fait que l'UTF-16 est rarement enregistrées sur le disque ou de les envoyer sur Internet: UTF-8 tend à être privilégiée pour la représentation externe.
Que votre application n'utilise pas l'Internet
(Maintenant, cela peut être une hypothèse valide pour votre logiciel, mais...)
Le web s'exécute sur UTF-8, et une pléthore de plus rares encodages. L' TCHAR
concept ne reconnaît que deux: "ANSI" (qui ne peut pas être en UTF-8) et "Unicode" (UTF-16). Il peut être utile pour faire vos appels d'API de Windows Unicode, mais c'est bougrement inutile pour faire de votre site web et adresse e-mail apps Unicode.
Que vous n'utilisez aucune non-Microsoft bibliothèques
Personne d'autre n'utilise TCHAR
. Poco utilise std::string
et UTF-8. SQLite est UTF-8 et UTF-16 versions de son API, mais pas d' TCHAR
. TCHAR
n'est même pas dans la bibliothèque standard, donc pas de std::tcout
, sauf si vous voulez définir vous-même.
Ce que je recommande, au lieu de TCHAR
Oublier que "ANSI" codages existent pas, sauf quand vous avez besoin de lire un fichier qui n'est pas UTF-8 valide. Oublier TCHAR
trop. Toujours appeler le "W" de la version de fonctions de l'API Windows. #define _UNICODE
juste pour vous assurer de ne pas accidentellement de l'appel d'une fonction "A".
Toujours utiliser de l'UTF codages pour les chaînes de caractères: UTF-8 char
chaînes et UTF-16 (sur Windows) ou UTF-32 (sur les systèmes de type Unix) wchar_t
des chaînes de caractères. typedef
UTF16
et UTF32
types de caractères pour éviter les différences de plate-forme.