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 TCHAR
concept 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::string
et UTF-8. SQLite a des versions UTF-8 et UTF-16 de son API, mais non TCHAR
. TCHAR
n'est même pas dans la bibliothèque standard, donc non, std::tcout
sauf 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 TCHAR
aussi. Appelez toujours la version "W" des fonctions de l'API Windows. #define _UNICODE
juste pour vous assurer de ne pas appeler accidentellement une fonction «A».
Utilisez toujours les encodages UTF pour les chaînes: UTF-8 pour les char
chaînes et UTF-16 (sous Windows) ou UTF-32 (sur les systèmes de type Unix) pour les wchar_t
chaînes. typedef
UTF16
et les UTF32
types de caractères pour éviter les différences de plate-forme.