Est TCHAR-elle toujours pertinente?
Je suis nouveau à la programmation sous Windows et après la lecture de la Petzold livre, je me demande:
est-il toujours de bonne pratique d'utiliser le TCHAR
type et la _T()
fonction de déclarer des chaînes ou si je dois juste utiliser le wchar_t
et L""
chaînes dans le nouveau code?
Je vais cibler uniquement Windows 2000 et mon code sera i18n de la start-up.
Vous devez vous connecter pour publier un commentaire.
J'ai toujours utiliser le TCHAR syntaxe si je faisais un nouveau projet aujourd'hui. Il n'y a pas beaucoup de différence pratique entre l'aide et de l'WCHAR syntaxe, et je préfère de code qui est explicite dans ce que le type de caractère est. Puisque la plupart des fonctions de l'API et les objets d'aide à la prise/utilisation TCHAR types (par exemple: CString), il est logique de l'utiliser. De Plus il vous donne de la souplesse si vous décidez d'utiliser le code dans un fichier ASCII application à un certain point, ou si Windows jamais évolue à Unicode32, etc.
Si vous décidez d'aller de l'WCHAR route, je serais explicite à ce sujet. Qui est, l'utilisation CStringW au lieu de CString, et le moulage des macros lors de la conversion de TCHAR (par exemple: CW2CT).
C'est mon opinion, de toute façon.
La réponse courte: PAS.
Comme tous les autres ont déjà écrit, beaucoup de programmeurs utilisent encore TCHARs et les fonctions correspondantes. À mon humble avis le concept était une mauvaise idée. UTF-16 chaîne de traitement est très différent que de simples ASCII/MBCS chaîne de traitement. Si vous utilisez les mêmes algorithmes/fonctions avec deux d'entre eux (c'est ce que le TCHAR idée est de partir!), vous obtenez une très mauvaise performance sur l'UTF-16 version si vous faites un peu plus que de la simple concaténation de chaîne (comme l'analyse etc.). La raison principale sont Les mères porteuses.
À la seule exception lorsque vous vraiment devez 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.
TCHAR
ne doit pas être utilisée plus, je suis en désaccord que c'était une mauvaise idée. Je pense aussi que si vous choisissez d'être explicite au lieu d'utiliserTCHAR
vous devez être explicite partout. I. e. ne pas utiliser des fonctions avecTCHAR
/_TCHAR
(comme_tmain
) dans leur déclaration soit. Il suffit de mettre: être cohérent. +1, toujours.TCHAR
s ont été initialement introduit pour: Pour faciliter le développement de code pour Win 9x et Windows NT versions de Windows. À l'époque, Windows NT UTF-16 de la mise en œuvre a été UCS-2, et les algorithmes de traitement de chaîne/de manipulation étaient identiques. Il n'y avait pas de substituts. Et même avec des mères porteuses, des algorithmes pour DBCS (la seule prise en charge de codage MBCS pour Windows) et UTF-16 sont les mêmes: Dans les deux de codage, un point de code se compose d'une ou de deux unités de code.FormatMessageW
, qui prend unLPWSTR
. Pas besoin d'utiliser le générique de texte mappages. Cela est vrai pour presque tous les appels d'API de Windows qui prennent des arguments de chaîne.Je suis d'accord avec Sascha. Le principe sous-jacent de
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 sera 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
char*
etwchar_t*
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 le 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
(C'est peut-être une hypothèse valable pour votre logiciel, mais...)
Le web s'exécute sur l'UTF-8 et une pléthore de plus rares encodages. Le
TCHAR
concept ne reconnaît que deux: "ANSI" (qui vous ne pouvez 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 ne l'utilise
TCHAR
. Poco utilisestd::string
et UTF-8. SQLite a UTF-8 et UTF-16 versions de son API, mais pas deTCHAR
.TCHAR
n'est même pas dans la bibliothèque standard, donc pas destd::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 l'UTF codages pour les chaînes de caractères: UTF-8 pour
char
cordes et UTF-16 (sur Windows) ou UTF-32 (sur les systèmes de type Unix) pourwchar_t
cordes.typedef
UTF16
etUTF32
types de caractères pour éviter les différences de plate-forme.#define _UNICODE
, même maintenant. Fin de transmission 🙂_UNICODE
contrôle la façon dont le générique de texte mappages sont résolus dans le CRT. Si vous ne souhaitez pas appeler la version ANSI de l'API de Windows, vous devez définirUNICODE
.Si vous vous demandez si elle est encore dans la pratique, alors oui - il est toujours utilisé un peu. Personne ne regarde votre code drôle si elle utilise TCHAR et _T(""). Le projet sur lequel je travaille actuellement est la conversion de l'ANSI en unicode - et nous allons le portable (TCHAR) l'itinéraire.
Cependant...
Mon vote serait oublier toutes les normes ANSI/UNICODE portable macros (TCHAR, _T(""), et tous les _tXXXXXX appels, etc...) et il suffit de supposer unicode partout. Je ne vois vraiment pas le point d'être portable si vous n'avez pas besoin d'une version ANSI. Je voudrais utiliser tous les caractères larges de fonctions et de types directement. Preprend tous les littéraux de chaîne avec un L.
La Introduction à la Programmation sous Windows l'article sur MSDN dit
Je m'en tiendrais à
wchar_t
etL""
.Je voudrais proposer une approche différente (aucun des deux).
Pour résumer, utiliser des char* et std::string, en supposant que l'encodage UTF-8, et de faire les conversions à l'UTF-16 seulement en enveloppant des fonctions de l'API.
Plus d'informations et la justification de cette approche dans les programmes Windows peut être trouvé dans http://www.utf8everywhere.org.
MultiByteToWideChar
. Mais vous ne pouvez pas convertir en UTF-8 à autre chose, sans d'abord la conversion UTF-16.TCHAR
/WCHAR
peut être suffisant pour certains anciens projets. Mais pour les nouvelles demandes, je dirais PAS.Tous ces
TCHAR
/WCHAR
choses sont là à cause de raisons historiques.TCHAR
fournit un convenable façon soignée (déguisement) pour basculer entre les normes ANSI encodage de texte (MBCS) et l'encodage Unicode (UTF-16). Dans le passé, les gens n'ont pas une compréhension de la nombre de caractères de toutes les langues dans le monde. Ils ont supposé que 2 octets ont été suffisantes pour représenter tous les caractères et de ce fait ayant un caractère de longueur fixe schéma de codage à l'aide deWCHAR
. Cependant, ce n'est plus vrai après la sortie de l'Unicode 2.0 dans 1996.C'est-à-dire:
Peu importe que vous utilisez dans la
CHAR
/WCHAR
/TCHAR
, le traitement de texte de la partie dans votre programme doit être capable de gérer variable de caractères de longueur pour l'internationalisation.Si vous avez réellement besoin de faire plus que de choisir l'un de
CHAR
/WCHAR
/TCHAR
pour la programmation de Windows:WCHAR
. Car il est plus facile de cette façon de travailler avec WinAPI avec le support de l'Unicode.Découvrez ce merveilleux site web pour une lecture plus détaillée:
http://utf8everywhere.org/
Oui, absolument, au moins pour le _T macro. Je ne suis pas si sûr sur le caractère des choses, cependant.
La raison d'être est de mieux soutenir les WinCE ou non standard, les plates-formes Windows. Si vous êtes certain à 100% que votre code restera sur NT, alors vous pouvez probablement juste de l'utilisation régulière de C-string déclarations. Cependant, il est préférable de tendre vers une approche plus flexible, car il est beaucoup plus facile à #define macro sur une plate-forme non windows en comparaison à aller au moyen de milliers de lignes de code et l'ajout de partout dans le cas où vous avez besoin de le port certains de la bibliothèque de windows mobile.
À mon humble avis, si il y a TCHARs dans votre code, vous travaillez au mauvais niveau d'abstraction.
Utilisation quelle que soit type de chaîne est plus pratique pour vous lorsque vous traitez avec traitement de texte - ce sera, j'espère, quelque chose de la prise en charge unicode, mais c'est à vous de voir. Faire de la conversion à l'OS API limites que nécessaire.
Lorsque vous traitez avec des chemins d'accès aux fichiers, concocter votre propre type, au lieu d'utiliser des chaînes de caractères. Cela vous permettra d'exploitation et des séparateurs de chemin, vous donnera une interface facile à code à l'encontre de manuel de concaténation de chaîne et de fractionnement, et sera beaucoup plus facile de s'adapter à différents Systèmes d'exploitation (ansi, ucs-2, utf-8, peu importe).
La seule raison que je vois à utiliser autre chose que de l'explicite WCHAR sont la mobilité et l'efficacité.
Si vous voulez faire de votre exécutable final aussi petite que possible l'utilisation de char.
Si vous n'avez pas de soins sur l'utilisation de la RAM et souhaitez internationalisation pour être aussi facile que de la simple traduction, l'utilisation WCHAR.
Si vous voulez faire de votre code flexible, utilisez TCHAR.
Si vous prévoyez sur l'utilisation des caractères latins, vous pourriez aussi bien utiliser l'ASCII/les chaînes MBCS de sorte que votre utilisateur n'a pas besoin d'autant de RAM.
Pour les personnes qui sont "i18n de la start-up", vous sauver vous-même le code source de l'espace et de simplement utiliser toutes les fonctions Unicode.
Juste en ajoutant à une vieille question:
PAS
Aller commencer une nouvelle CLR projet C++ dans VS2010. Microsoft utilisent eux-mêmes
L"Hello World"
, 'nuff said.C
etC++
. Les réponses peuvent toujours être supprimés par leurs auteurs respectifs. Ce serait un bon moment pour utiliser cette disposition.