INFORMAZIONI: Suggerimenti per la scrittura di applicazioni compatibili con DBCS

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
Questo articolo è stato archiviato. L’articolo, quindi, viene offerto “così come è” e non verrà più aggiornato.
3.10 3.00 Kbprg WINDOWS
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;   }				
3.10 3.00

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 75439 - Ultima revisione: 02/12/2014 05:46:41 - Revisione: 1.1

Microsoft Windows Software Development Kit 3.1

  • kbnosurvey kbarchive kbmt kb16bitonly kbinfo KB75439 KbMtit
Feedback
ERROR: at System.Diagnostics.Process.Kill() at Microsoft.Support.SEOInfrastructureService.PhantomJS.PhantomJSRunner.WaitForExit(Process process, Int32 waitTime, StringBuilder dataBuilder, Boolean isTotalProcessTimeout)