J'utiliserais toujours la syntaxe TCHAR si je faisais un nouveau projet aujourd'hui. Il n'y a pas beaucoup de différence pratique entre son utilisation et la syntaxe WCHAR, et je préfère le code qui est explicite dans le type de caractère. Étant donné que la plupart des fonctions API et des objets d'assistance prennent / utilisent des types TCHAR (par exemple: CString), il est logique de l'utiliser. De plus, cela vous donne de la flexibilité si vous décidez d'utiliser le code dans une application ASCII à un moment donné, ou si Windows évolue un jour vers Unicode32, etc.
Si vous décidez d'emprunter la voie WCHAR, je serais explicite à ce sujet. Autrement dit, utilisez CStringW au lieu de CString et transtypez des macros lors de la conversion en TCHAR (par exemple: CW2CT).
C'est mon avis, de toute façon.
La réponse courte: NON .
Comme tous les autres déjà écrits, de nombreux programmeurs utilisent encore les TCHAR et les fonctions correspondantes. À mon humble avis, tout le concept était une mauvaise idée . Le traitement des chaînes UTF-16 est très différent du simple traitement des chaînes ASCII / MBCS. Si vous utilisez les mêmes algorithmes / fonctions avec les deux (c'est sur quoi est basée l'idée TCHAR!), Vous obtenez de très mauvaises performances sur la version UTF-16 si vous faites un peu plus que la simple concaténation de chaînes (comme analyse, etc.). La principale raison sont les substituts .
À la seule exception où vous devez vraiment compiler votre application pour un système qui ne prend pas en charge Unicode, je ne vois aucune raison d'utiliser ce bagage du passé dans une nouvelle application.
la source
TCHAR
ne devrait plus être utilisé, je ne suis pas d'accord pour dire que c'était une mauvaise idée. Je pense aussi que si vous choisissez d'être explicite au lieu d'utiliser,TCHAR
vous devez être explicite partout . Ie n'utilise pas non plus de fonctions avecTCHAR
/_TCHAR
(comme_tmain
) dans leur déclaration. En termes simples: soyez cohérent. +1, toujours.TCHAR
été initialement introduit pour: Pour faciliter le développement du code pour les versions Windows 9x et Windows NT de Windows. À ce moment-là, l'implémentation UTF-16 de Windows NT était UCS-2 et les algorithmes d'analyse / manipulation de chaînes étaient identiques. Il n'y avait pas de substituts. Et même avec des substituts, les algorithmes pour DBCS (le seul encodage MBCS pris en charge pour Windows) et UTF-16 sont les mêmes: dans les deux encodages, un point de code se compose d'une ou deux unités de code.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ésultatswchar_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 utilisestd::string
et UTF-8. SQLite a des versions UTF-8 et UTF-16 de son API, mais nonTCHAR
.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 leswchar_t
chaînes.typedef
UTF16
et lesUTF32
types de caractères pour éviter les différences de plate-forme.la source
#define _UNICODE
même maintenant. Fin de la transmission :)_UNICODE
contrôle la façon dont les mappages de texte générique sont résolus dans le CRT. Si vous ne souhaitez pas appeler la version ANSI d'une API Windows, vous devez définirUNICODE
.Si vous vous demandez si c'est encore en pratique, alors oui - c'est encore un peu utilisé. Personne ne regardera votre code de manière amusante s'il utilise TCHAR et _T (""). Le projet sur lequel je travaille actuellement consiste à convertir ANSI en Unicode - et nous allons sur la route portable (TCHAR).
Pourtant...
Mon vote serait d'oublier toutes les macros portables ANSI / UNICODE (TCHAR, _T (""), et tous les appels _tXXXXXX, etc ...) et de supposer juste unicode partout. Je ne vois vraiment pas l'intérêt d'être portable si vous n'avez jamais besoin d'une version ANSI. J'utiliserais directement toutes les fonctions et types de caractères larges. Faites précéder tous les littéraux de chaîne d'un L.
la source
L'article Introduction à la programmation Windows sur MSDN dit
Je m'en tiendrai à
wchar_t
etL""
.la source
Je voudrais suggérer une approche différente (aucune des deux).
Pour résumer, utilisez char * et std :: string, en supposant le codage UTF-8, et effectuez les conversions en UTF-16 uniquement lors de l'encapsulation des fonctions API.
Vous trouverez plus d'informations et une justification de cette approche dans les programmes Windows sur http://www.utf8everywhere.org .
la source
TCHAR
/WCHAR
pourrait suffire pour certains projets hérités. Mais pour les nouvelles applications, je dirais NON .Tous ces
TCHAR
/WCHAR
trucs sont là pour des raisons historiques.TCHAR
fournit une manière élégante (déguisement) de basculer entre le codage de texte ANSI (MBCS) et le codage de texte Unicode (UTF-16). Dans le passé, les gens ne comprenaient pas le nombre de caractères de toutes les langues du monde. Ils ont supposé que 2 octets étaient suffisants pour représenter tous les caractères et ainsi avoir un schéma de codage de caractères de longueur fixe utilisantWCHAR
. Cependant, ce n'est plus le cas après la sortie d'Unicode 2.0 en 1996 .Autrement dit: peu importe ce que vous utilisez dans
CHAR
/WCHAR
/TCHAR
, la partie de traitement de texte de votre programme devrait être capable de gérer des caractères de longueur variable pour l'internationalisation.Vous devez donc en fait faire plus que d'en choisir un dans
CHAR
/WCHAR
/TCHAR
pour la programmation sous Windows:WCHAR
. Comme il est plus simple de travailler avec WinAPI avec le support Unicode.Consultez ce merveilleux site Web pour une lecture plus approfondie: http://utf8everywhere.org/
la source
Oui absolument; au moins pour la macro _T. Je ne suis pas si sûr des trucs à gros caractères, cependant.
La raison en est de mieux prendre en charge WinCE ou d'autres plates-formes Windows non standard. Si vous êtes sûr à 100% que votre code restera sur NT, vous pouvez probablement simplement utiliser des déclarations C-string régulières. Cependant, il est préférable de tendre vers une approche plus flexible, car il est beaucoup plus facile de #définir cette macro sur une plate-forme non Windows par rapport à parcourir des milliers de lignes de code et à l'ajouter partout au cas où vous auriez besoin de porter une bibliothèque. à Windows Mobile.
la source
À mon humble avis, s'il y a des TCHAR dans votre code, vous travaillez au mauvais niveau d'abstraction.
Utilisez tout type de chaîne est plus pratique pour vous lorsqu'il s'agit de traitement de texte - ce sera , espérons - être quelque chose unicode soutenir, mais c'est à vous. Effectuez la conversion aux limites de l'API du système d'exploitation si nécessaire.
Lorsque vous traitez des chemins de fichiers, créez votre propre type personnalisé au lieu d'utiliser des chaînes. Cela vous permettra des séparateurs de chemins indépendants du système d'exploitation, vous donnera une interface plus facile à coder que la concaténation et le fractionnement manuels de chaînes, et sera beaucoup plus facile à adapter à différents systèmes d'exploitation (ansi, ucs-2, utf-8, peu importe) .
la source
Les seules raisons que je vois pour utiliser autre chose que le WCHAR explicite sont la portabilité et l'efficacité.
Si vous voulez rendre votre exécutable final aussi petit que possible, utilisez char.
Si vous ne vous souciez pas de l'utilisation de la RAM et que vous voulez que l'internationalisation soit aussi simple qu'une simple traduction, utilisez WCHAR.
Si vous souhaitez rendre votre code flexible, utilisez TCHAR.
Si vous prévoyez d'utiliser uniquement les caractères latins, vous pouvez également utiliser les chaînes ASCII / MBCS pour que votre utilisateur n'ait pas besoin d'autant de RAM.
Pour les personnes qui sont "i18n dès le départ", économisez vous-même l'espace de code source et utilisez simplement toutes les fonctions Unicode.
la source
Juste ajouter à une vieille question:
NON
Allez démarrer un nouveau projet CLR C ++ dans VS2010. Microsoft eux-mêmes utilisent
L"Hello World"
», a déclaré Nuff.la source
C
etC++
. Les réponses peuvent toujours être supprimées par leurs auteurs respectifs. Ce serait le bon moment pour utiliser cette disposition.TCHAR
ont une nouvelle signification pour porter deWCHAR
àCHAR
.https://docs.microsoft.com/en-us/windows/uwp/design/globalizing/use-utf8-code-page
la source