INFO : conseils pour la création d'applications compatibles de DBCS

Traductions disponibles Traductions disponibles
Numéro d'article: 75439 - Voir les produits auxquels s'applique cet article
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
3,00 3.10 Kbprg WINDOWS
Agrandir tout | Réduire tout

Résumé

Opérations dans les systèmes qui utilisent un Double-Byte Character jeu (sur deux octets DBCS) sur les chaînes sont légèrement différentes d'un système de caractères codés sur un. Cet article fournit les instructions complètes pour réduire le travail nécessaire au port d'une application écrite pour un système codé sur un système DBCS.

Plus d'informations

Dans un jeu de caractères codés sur deux octets, certains caractères nécessitent deux d'octets, tandis que certaines nécessitent uniquement un octet. Le pilote de langue pouvez distinguer ces deux types de caractères en désignant des caractères sous forme de « octets avance ». Un octet en tête sera suivie autre octet (un « octet Queue ») pour créer un Double-Byte Character (DBC). L'ensemble des octets de prospect est différent pour chaque langue. Octets délai garantis sont toujours être des caractères étendus ; aucun caractères ASCII 7 bits ne peuvent être responsable octets. L'octet Queue peut être n'importe quel octet sauf un octet NULL. La fin d'une chaîne est toujours définie comme le premier octet NULL dans la chaîne. Octets de prospect sont Queue juridique octets ; le seul moyen de savoir si un octet opère comme un octet en tête est à partir du contexte.

Le Windows Kit (SDK) version 3.0 inclut deux fonctions pour déplacer des chaînes qui peuvent contenir DBCs : AnsiNext() et AnsiPrev() . La fonction AnsiPrev() est un appel coûteuse temps car il doit s'exécuter via la chaîne à partir du début pour déterminer où commence le caractère précédent. Il est préférable rechercher des caractères à partir du début plutôt que la fin d'une chaîne.

Le SDK Windows version 3.1 inclut la fonction IsDBCSLeadByte() , qui renvoie la valeur TRUE si et seulement si l'octet CAN BE un octet en tête. Parce que cette fonction accepte un caractère paramètre, il ne peut pas signaler si l'octet est un octet en tête (pour cela serait nécessitent contexte).

Pour rendre le code non DBCS exécuté aussi rapidement que possible, un fichier source peut utiliser « #ifdef DBCS » autour de code qui est uniquement pour les jeux de caractères codés sur deux octets et compiler les deux versions du fichier objet (OBJ). Par exemple :
   #ifdef DBCS
     for (pszTemp = szString; *pszTemp; pszTemp = AnsiNext(pszTemp))
   #else
     for (pszTemp = szString; *pszTemp; ++pszTemp)
   #endif

   ...
				
rendre le code plus facile à lire, une application peut définir les macros pour les fonctions AnsiNext() et AnsiPrev() Si DBCS n'est pas défini :
   #ifndef DBCS

   #define AnsiNext(x) ((x)+1)
   #define AnsiPrev(y, x) ((x)-1)

   #ifdef WIN31

   #define IsDBCSLeadByte(x) (FALSE)

   #endif

   #endif
				
avec ces définitions en place, tout le code peuvent être écrits pour les jeux de caractères codés sur deux octets. Notez que la fonction AnsiNext() ne dépassent pas la fin d'une chaîne et la fonction AnsiPrev() ne dépassent pas début d'une chaîne, tandis que les macros sont. En outre, car le paramètre « y » dans la macro AnsiPrev() est ignoré, du code vous donnera des résultats différents lorsque compilé avec et sans DBCS défini. Le code suivant est un exemple de ce phénomène :
   pszEnd = AnsiPrev(++pszStart, pszEnd);
				
le code suivant montre comment rechercher le décalage de nom de fichier dans un nom de chemin complet :
   LPSTR GetFilePtr(LPSTR lpszFullPath)
   {

    LPSTR lpszFileName;

    for (lpszFileName = lpszFullPath; *lpszFullPath;
               lpszFullPath = AnsiNext(lpszFullPath))
        if (*lpszFullPath == ':' || *lpszFullPath == '\\')
            lpszFileName = lpszFullPath + 1;

    return lpszFileName;

   }
				
Remarque que ': 'et' \\ » sont forcément ne pas octets du prospect. La recherche démarré à partir du début de la chaîne plutôt que la fin pour éviter à l'aide de la fonction AnsiPrev() .

Le code suivant illustre une copie de chaîne dans un tampon de taille limitée. Notez que cela garantit que la chaîne ne se termine pas par un octet en tête.
   int StrCpyN(LPSTR lpszDst, LPSTR lpszSrc, unsigned int wLen)

   {

    LPSTR lpEnd;
    char cTemp;

    // account for the terminating NULL
    --wLen;

    for (lpEnd = lpszSrc; *lpEnd && (lpEnd - lpszSrc) < wLen;
               lpEnd = AnsiNext(lpEnd))
        ;  // scan to the end of string, or wLen bytes

    // The following can happen only if lpszSrc[wLen-1] is a lead
    // byte, in which case do not include the previous DBC in the copy.
    if (lpEnd - lpszSrc > wLen)
        lpEnd -= 2;

    // Terminate the source string and call lstrcpy.
    cTemp = *lpEnd;
    *lpEnd = '\0';
    lstrcpy(lpszDst, lpszSrc);
    *lpEnd = cTemp;

   }
				

Propriétés

Numéro d'article: 75439 - Dernière mise à jour: jeudi 6 février 2014 - Version: 1.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Windows Software Development Kit 3.1
Mots-clés : 
kbnosurvey kbarchive kbmt kb16bitonly kbinfo KB75439 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 75439
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com