Synthèse de la programmation Unicode
Mise à jour : novembre 2007
Pour tirer parti de la prise en charge MFC et de la bibliothèque Runtime C pour Unicode, vous devez :
Définir _UNICODE.
Définissez le symbole _UNICODE avant de générer votre programme.
Spécifier un point d'entrée.
Dans la page Sortie du dossier Éditeur de liens de la boîte de dialogue Pages de propriétés du projet, définissez le symbole de point d'entrée à wWinMainCRTStartup.
Utiliser des fonctions et des types portables.
Utilisez les fonctions runtime C correctes pour la gestion des chaînes Unicode. Vous pouvez utiliser la famille de fonctions wcs, mais vous pouvez préférer les macros portables _TCHAR (compatible pour l'internationale). Ces macros utilisent un préfixe _tcs et remplacent les fonctions de la famille str. Ces fonctions sont décrites en détail dans la section Internationalisation de la référence de la bibliothèque Runtime. Pour plus d'informations, consultez Mappages de texte générique dans Tchar.h.
Utilisez _TCHAR et les types de données portables associées décrites dans Prise en charge pour Unicode.
Gérer les chaînes littérales correctement.
Le compilateur Visual C++ interprète une chaîne littérale codée comme suit :
L"this is a literal string"
pour indiquer une chaîne de caractères Unicode. Vous pouvez utiliser le même préfixe pour les caractères littéraux. Utilisez la macro _T pour coder les chaînes littérales génériquement, afin qu'elles soient compilées en tant que chaînes Unicode sous Unicode ou en tant que chaînes ANSI (y compris MBCS) sans Unicode. Par exemple, au lieu de :
pWnd->SetWindowText( "Hello" );
utilisez :
pWnd->SetWindowText( _T("Hello") );
Lorsque _UNICODE est défini, _T traduit la chaîne littérale en formulaire avec un préfixe L, dans le cas contraire, _T traduit la chaîne sans préfixe L.
Conseil : La macro _T est identique à la macro _TEXT.
Faire attention lorsque vous passez des longueurs de chaînes aux fonctions.
Certaines fonctions utilisent le nombre de caractères d'une chaîne, d'autres le nombre d'octets. Par exemple, si _UNICODE est défini, l'appel suivant à l'objet CArchive ne fonctionnera pas (str est un CString) :
archive.Write( str, str.GetLength( ) ); // invalid
Dans une application Unicode, la longueur vous donne le nombre de caractères mais pas le nombre correct d'octets, dans la mesure où chaque caractère utilise deux octets. Vous devez utiliser :
archive.Write( str, str.GetLength( ) * sizeof( _TCHAR ) ); // valid
qui indique le nombre correct d'octets à écrire.
Cependant, les fonctions membres MFC orientées caractère, plutôt qu'octet, fonctionnent sans codage supplémentaire :
pDC->TextOut( str, str.GetLength( ) );
CDC::TextOut prend un nombre de caractères et non un nombre d'octets.
Utilisez fopen_s, _wfopen_s pour ouvrir des fichiers Unicode.
Pour résumer, MFC et la bibliothèque Runtime fournissent la prise en charge suivante pour la programmation Unicode sous Windows 2000 :
À l'exception des fonctions membres de classe de base de données, toutes les fonctions MFC sont compatibles Unicode, y compris CString. CString fournit également des fonctions de conversion Unicode/ANSI.
La bibliothèque Runtime fournit les versions Unicode de toutes les fonctions de gestion de chaînes. (La bibliothèque Runtime fournit également des versions portables utilisables pour Unicode ou pour MBCS. Il s'agit des macros _tcs.)
Tchar.h fournit des types de données portables et la macro _T pour la traduction des chaînes et des caractères de type littéral. Pour plus d'informations, consultez Mappages de texte générique dans Tchar.h.
La bibliothèque Runtime fournit une version à caractère large de main. Utilisez wmain afin que votre application devienne compatible Unicode.