INFO: Tipps für DBCS-kompatible Anwendungen schreiben

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 75439 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
3.00 3.10 WINDOWS Kbprg
Alles erweitern | Alles schließen

Zusammenfassung

Zeichenfolgenoperationen in Systemen, die ein Doppelbyte-Zeichensatz (DBCS) unterscheiden sich geringfügig von einem System Single-Byte-Zeichensatz. Dieser Artikel enthält Richtlinien für die Arbeit erforderlich, eine Anwendung für ein Single-Byte-System mit einem DBCS-System geschrieben port zu reduzieren.

Weitere Informationen

In einen Double-Byte-Zeichensatz erfordern einige Zeichen zwei Bytes, während einige nur ein Byte erforderlich. Der Language-Treiber kann diese zwei Arten von Zeichen, indem Sie einige Zeichen als "führende Bytes" unterscheiden. Ein führendes Byte folgt ein anderes Byte (eine "Tail") um eine Doppelbyte-Zeichen (Datenbank) zu erstellen. Der Satz der führende Bytes unterscheidet sich für jede Sprache. Führende Bytes sind immer garantiert Zeichen erweitert werden; keine 7-Bit-ASCII-Zeichen können führende Bytes. Das Tail Byte kann jedes Byte außer NULL-Byte sein. Am Ende einer Zeichenfolge wird immer als das erste NULL Byte in der Zeichenfolge definiert. Führende Bytes sind legal Tail Byte; die einzige Möglichkeit, mitzuteilen, wenn ein Byte als führendes Byte fungiert, ist aus dem Kontext.

Die Windows Software Development Kit (SDK) Version 3.0 enthält zwei Funktionen zum Verschieben über Zeichenfolgen, die DBCs enthalten können: AnsiNext() und AnsiPrev() . Die AnsiPrev() -Funktion ist ein immer teuer Aufruf, da es durch die Zeichenfolge, vom Anfang ausführen muss um festzustellen, wo das vorherige Zeichen beginnt. Es wird empfohlen, nach Zeichen vom Anfang statt am Ende einer Zeichenfolge zu suchen.

Das Windows SDK Version 3.1 enthält die IsDBCSLeadByte() -Funktion, die TRUE zurückgibt, und nur, wenn das Byte ein führendes Byte sein kann. Da diese Funktion eine Char-Parameter kann nicht es Bericht Wenn das Byte ein führendes Byte ist (dazu würde Kontext erforderlich).

Damit nicht-DBCS-Code so schnell wie möglich ausgeführt wird, kann eine Quelldatei "# ifdef DBCS" verwenden, um Code, der nur für DBCS ist, und zwei Versionen der Objektdatei (OBJ) kompilieren. Zum Beispiel:
   #ifdef DBCS
     for (pszTemp = szString; *pszTemp; pszTemp = AnsiNext(pszTemp))
   #else
     for (pszTemp = szString; *pszTemp; ++pszTemp)
   #endif

   ...
				
damit den Code leichter zu lesen sind, konnte Makros für die AnsiNext() und AnsiPrev() -Funktion von eine Anwendung definieren, wenn DBCS nicht definiert ist:
   #ifndef DBCS

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

   #ifdef WIN31

   #define IsDBCSLeadByte(x) (FALSE)

   #endif

   #endif
				
mit diese Definitionen an Stelle der gesamte Code geschrieben werden kann für DBCS. Beachten Sie, dass die AnsiNext() -Funktion nicht über das Ende einer Zeichenfolge geht und die AnsiPrev() -Funktion nicht hinter dem Anfang einer Zeichenfolge gehen, wird während die Makros werden. Da der Parameter "y" in das Makro AnsiPrev() ignoriert wird, erhalten einige Code darüber hinaus unterschiedliche Ergebnisse bei der Kompilierung mit und ohne DBCS definiert. Der folgende Code ist ein Beispiel für dieses Phänomen:
   pszEnd = AnsiPrev(++pszStart, pszEnd);
				
die folgenden Code wird das finden des Offset der Dateiname in einen vollständigen Pfadnamen veranschaulicht:
   LPSTR GetFilePtr(LPSTR lpszFullPath)
   {

    LPSTR lpszFileName;

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

    return lpszFileName;

   }
				
beachten, ': 'und' \\ ' sind garantiert nicht führende Bytes. Die Suche am Anfang der Zeichenfolge statt am Ende damit mit der AnsiPrev() -Funktion wurde gestartet.

Der folgende Code veranschaulicht eine Zeichenfolgenkopie in einen Puffer Größe beschränkt. Beachten Sie, dass es wird sichergestellt, dass die Zeichenfolge nicht mit ein führendes Byte endet.
   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;

   }
				

Eigenschaften

Artikel-ID: 75439 - Geändert am: Sonntag, 2. Februar 2014 - Version: 1.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Windows Software Development Kit 3.1
Keywords: 
kbnosurvey kbarchive kbmt kb16bitonly kbinfo KB75439 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 75439
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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