INFORMAZIONI: Suggerimenti per la scrittura di applicazioni compatibili con DBCS

Traduzione articoli Traduzione articoli
Identificativo articolo: 75439 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo è stato archiviato. L?articolo, quindi, viene offerto ?così come è? e non verrà più aggiornato.
3.10 3.00 Kbprg WINDOWS
Espandi tutto | Chiudi tutto

Sommario

Le operazioni di stringa in sistemi che utilizzano un byte doppio set di caratteri (DBCS) sono leggermente diversi da un sistema di caratteri a byte singolo. In questo articolo vengono fornite istruzioni per ridurre il lavoro necessario per la porta di un'applicazione scritta per un sistema a byte singolo a un sistema DBCS.

Informazioni

In un set di caratteri a byte doppio, è necessario che alcuni caratteri di due byte, mentre alcune è necessario indicare un solo byte. Il driver di linguaggio possibile distinguere questi due tipi di caratteri, definendo alcuni caratteri come "byte iniziali". Un byte iniziale sarà seguito da un altro byte (una "coda") per creare un carattere a due byte (DBC). Il set di byte iniziali è diverso per ogni lingua. Byte iniziali sono sempre essere caratteri estesi; caratteri non ASCII a 7 bit possono essere un byte di apertura. Il byte finale può essere qualsiasi byte ad eccezione di un byte NULL. La fine di una stringa è sempre definita come il primo byte NULL nella stringa. Byte iniziali sono byte finale valido; l'unico modo per stabilire se un byte viene utilizzato come un byte iniziale è dal contesto.

Windows Software Development Kit (SDK) versione 3.0 include due funzioni per lo spostamento in stringhe contenenti DBCs: AnsiNext() e AnsiPrev() . La funzione di AnsiPrev() è una chiamata di costosi di volta in quanto attraverso la stringa deve essere eseguita dall'inizio per determinare in cui inizia il carattere precedente. Si consiglia di cercare caratteri dall'inizio anziché la fine di una stringa.

il SDK di Windows versione 3.1 include la funzione di IsDBCSLeadByte() , che restituisce TRUE se e solo se il byte può essere un byte iniziale. Poiché questa funzione accetta un valore char parametro, Impossibile segnalare se il byte è un byte iniziale (per effettuare questa operazione richiederebbe contesto).

Per rendere il codice non DBCS eseguito più rapidamente possibile, un file di origine potrebbe utilizzare "DBCS # ifdef" intorno al codice solo per i caratteri DBCS e compilare due versioni del file oggetto (OBJ). Ad esempio:
   #ifdef DBCS
     for (pszTemp = szString; *pszTemp; pszTemp = AnsiNext(pszTemp))
   #else
     for (pszTemp = szString; *pszTemp; ++pszTemp)
   #endif

   ...
				
per semplificare il codice leggere, un'applicazione potrebbe definire macro per le funzioni AnsiNext() e AnsiPrev() se non è definito DBCS:
   #ifndef DBCS

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

   #ifdef WIN31

   #define IsDBCSLeadByte(x) (FALSE)

   #endif

   #endif
				
con queste definizioni posto, tutto il codice possono essere scritti per i caratteri DBCS. Si noti che la funzione AnsiNext() non verrà eseguito oltre la fine di una stringa e la funzione AnsiPrev() non passerà oltre l'inizio di una stringa, mentre le macro. Inoltre, poiché il parametro "y" nella macro AnsiPrev() viene ignorato, codice fornirà risultati diversi quando viene compilato con e senza DBCS definito. Il codice riportato di seguito è un esempio di questo fenomeno:
   pszEnd = AnsiPrev(++pszStart, pszEnd);
				
il codice riportato di seguito viene illustrato come trovare l'offset del nome di file in un nome di percorso completo:
   LPSTR GetFilePtr(LPSTR lpszFullPath)
   {

    LPSTR lpszFileName;

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

    return lpszFileName;

   }
				
notare che ":"e"\\" non sono necessariamente byte iniziali. La ricerca avviata dall'inizio della stringa, anziché alla fine di evitare di utilizzare la funzione AnsiPrev() .

Nel codice riportato di seguito viene illustrato una copia della stringa in un buffer di dimensioni limitate. Si noti che garantisce che la stringa non termina con un byte iniziale.
   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;

   }
				

Proprietà

Identificativo articolo: 75439 - Ultima modifica: mercoledì 12 febbraio 2014 - Revisione: 1.1
Le informazioni in questo articolo si applicano a:
  • Microsoft Windows Software Development Kit 3.1
Chiavi: 
kbnosurvey kbarchive kbmt kb16bitonly kbinfo KB75439 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 75439
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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