Je suis d'accord avec Sascha. La prémisse sous-jacente de TCHAR/ _T()/ etc. est que vous pouvez écrire une application basée sur "ANSI" puis lui donner comme par magie le support Unicode en définissant une macro. Mais cela repose sur plusieurs mauvaises hypothèses:
Que vous construisez activement les versions MBCS et Unicode de votre logiciel
Sinon, vous allez glisser et utiliser ordinaires char*cordes dans de nombreux endroits.
Que vous n'utilisez pas d'échappements anti-slash non ASCII dans les littéraux _T ("...")
À moins que votre encodage "ANSI" ne soit ISO-8859-1, les littéraux char*et les résultats wchar_t*ne représenteront pas les mêmes caractères.
Les chaînes UTF-16 sont utilisées comme les chaînes "ANSI"
Ils ne sont pas. Unicode introduit plusieurs concepts qui n'existent pas dans la plupart des encodages de caractères hérités. Substituts. Combinaison de caractères. Normalisation. Règles de casse conditionnelles et sensibles à la langue.
Et peut-être plus important encore, le fait que l'UTF-16 est rarement enregistré sur disque ou envoyé sur Internet: UTF-8 a tendance à être préféré pour la représentation externe.
Que votre application n'utilise pas Internet
(Maintenant, cela peut être une hypothèse valable pour votre logiciel, mais ...)
Le Web fonctionne sur UTF-8 et une pléthore d'encodages plus rares . Le TCHARconcept n'en reconnaît que deux: "ANSI" (qui ne peut pas être UTF-8 ) et "Unicode" (UTF-16). Cela peut être utile pour rendre vos appels d'API Windows compatibles Unicode, mais c'est sacrément inutile pour rendre vos applications Web et de messagerie compatibles Unicode.
Que vous n'utilisez aucune bibliothèque non-Microsoft
Personne d'autre n'utilise TCHAR. Poco utilise std::stringet UTF-8. SQLite a des versions UTF-8 et UTF-16 de son API, mais non TCHAR. TCHARn'est même pas dans la bibliothèque standard, donc non, std::tcoutsauf si vous voulez le définir vous-même.
Ce que je recommande à la place de TCHAR
Oubliez que les encodages "ANSI" existent, sauf lorsque vous avez besoin de lire un fichier qui n'est pas valide UTF-8. Oubliez TCHARaussi. Appelez toujours la version "W" des fonctions de l'API Windows. #define _UNICODEjuste pour vous assurer de ne pas appeler accidentellement une fonction «A».
Utilisez toujours les encodages UTF pour les chaînes: UTF-8 pour les charchaînes et UTF-16 (sous Windows) ou UTF-32 (sur les systèmes de type Unix) pour les wchar_tchaînes. typedef UTF16et les UTF32types de caractères pour éviter les différences de plate-forme.