Synthèse de la programmation Unicode
Pour tirer parti de la prise en charge du temps d’exécution MFC et C pour Unicode, vous devez :
Définir
_UNICODE
.Définissez le symbole
_UNICODE
avant de générer votre programme.Spécifiez le point d’entrée.
Dans la page Avancé du dossier Éditeur de liens dans la boîte de dialogue Pages de propriétés du projet, définissez le symbole
wWinMainCRTStartup
point d’entrée sur .Utilisez des fonctions et des types d’exécution portables.
Utilisez les fonctions d’exécution C appropriées pour la gestion des chaînes Unicode. Vous pouvez utiliser la
wcs
famille de fonctions, mais vous préférerez peut-être les macros entièrement portables (à_TCHAR
l’échelle internationale). Ces macros sont toutes précédées_tcs
; elles remplacent, une pour une, pour lastr
famille de fonctions. Ces fonctions sont décrites en détail dans la section Internationalisation de la référence de la bibliothèque d’exécution. Pour plus d’informations, consultez Mappages de texte générique dans tchar.h.Utilisez
_TCHAR
et les types de données portables associés décrits dans La prise en charge d’Unicode.Gérez correctement les chaînes littérales.
Le compilateur Visual C++ interprète une chaîne littérale codée comme suit :
L"this is a literal string"
pour signifier une chaîne de caractères Unicode. Vous pouvez utiliser le même préfixe pour les caractères littéraux. Utilisez la
_T
macro pour coder des chaînes littérales de manière générique, afin qu’elles se compilent en tant que chaînes Unicode sous Unicode ou en tant que chaînes ANSI (y compris Mo CS) sans Unicode. Par exemple, à la place de :pWnd->SetWindowText( "Hello" );
utiliser :
pWnd->SetWindowText( _T("Hello") );
Avec
_UNICODE
défini,_T
traduit la chaîne littérale en forme préfixée L ; sinon,_T
traduit la chaîne sans le préfixe L.Conseil
La
_T
macro est identique à la_TEXT
macro.Veillez à passer des longueurs de chaîne aux fonctions.
Certaines fonctions veulent le nombre de caractères dans une chaîne ; d’autres souhaitent le nombre d’octets. Par exemple, si
_UNICODE
elle est définie, l’appel suivant à unCArchive
objet ne fonctionnera pas (str
est unCString
) :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, car chaque caractère est de 2 octets de large. Au lieu de cela, vous devez utiliser :
archive.Write( str, str.GetLength( ) * sizeof( _TCHAR ) ); // valid
qui spécifie le nombre correct d’octets à écrire.
Toutefois, les fonctions membres MFC orientées caractères, plutôt que orientées octets, fonctionnent sans ce codage supplémentaire :
pDC->TextOut( str, str.GetLength( ) );
CDC::TextOut
prend un certain nombre de caractères, pas un nombre d’octets.Utilisez fopen_s, _wfopen_s pour ouvrir des fichiers Unicode.
Pour résumer, MFC et la bibliothèque d’exécution fournissent la prise en charge suivante de la programmation Unicode :
À l’exception des fonctions membres de la classe de base de données, toutes les fonctions MFC sont compatibles Unicode, notamment
CString
.CString
fournit également des fonctions de conversion Unicode/ANSI.La bibliothèque d’exécution fournit des versions Unicode de toutes les fonctions de gestion des chaînes. (La bibliothèque d’exécution fournit également des versions portables adaptées à Unicode ou à Mo CS. Il s’agit des
_tcs
macros.)tchar.h fournit des types de données portables et la
_T
macro pour traduire des chaînes littérales et des caractères. Pour plus d’informations, consultez Mappages de texte générique dans tchar.h.La bibliothèque d’exécution fournit une version à caractères larges de
main
. Permetwmain
de prendre en charge votre application Unicode.