INFORMACE: Tipy pro zápis DBCS Compatible Applications

Překlady článku Překlady článku
ID článku: 75439 - Produkty, které se vztahují k tomuto článku.
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
3.00 3.10 WINDOWS kbprg
Rozbalit všechny záložky | Minimalizovat všechny záložky

Souhrn

Řetězec operace v systémech, které používají dvoubajtové znakové sady (DBCS) jsou mírně odlišné z jednobajtových znaků systému. Tento článek obsahuje pokyny snížit práce potřebné k portu aplikace napsané pro systém jednobajtové DBCS systému.

Další informace

Některé znaky dvoubajtové znakové sady vyžadují dva bajty, zatímco některé vyžadují pouze jeden bajt. Ovladač jazyka lze rozlišit mezi tyto dva typy znaků označením některé znaky jako "zájemce bajty." Jiné bajt ("ocas bajt") vytvořit dvoubajtové znakové (DBC) následovaný vedoucí bajt. Sada bajtů zájemce je jiné pro každý jazyk. Bajtů zájemce je zaručena vždy být rozšířené znaky; žádné 7bitové znaky ASCII mohou být zájemce bajtů. Bajt ocas může být libovolný bajt kromě bajtu NULL. Konec řetězec je vždy definován jako první bajt NULL v řetězci. Zájemce bajtů jsou právní ocas bajtů; je jediným způsobem, jak poznat, pokud vedoucí bajt plnící bajtu z kontextu.

Windows Software Development Kit (SDK) verze 3.0 zahrnuje dvě funkce pro přesouvání prostřednictvím řetězce mohou obsahovat DBCs: AnsiNext() a AnsiPrev(). Funkce AnsiPrev() je volání čas nákladné, protože musí spustit prostřednictvím řetězce od začátku určit, kde začíná předchozí znak. Je vhodné vyhledat znaky ze začátku spíše než na konec řetězce.

Windows verze 3.1 obsahuje funkci IsDBCSLeadByte(), která vrátí hodnotu TRUE pouze v případě bajt může být vedoucí bajt. Protože tato funkce trvá char parametr, jej nelze sestavu Pokud bajt IS vedoucí bajt (k tomu by vyžadovat kontextu).

Pokud chcete, aby kód DBCS jako rychle jako možné spustit, může zdrojový soubor pomocí "#ifdef DBCS" kolem kód je pouze pro DBCS a kompilovat dvě verze souboru objektu (OBJ). Například:
   #ifdef DBCS
     for (pszTemp = szString; *pszTemp; pszTemp = AnsiNext(pszTemp))
   #else
     for (pszTemp = szString; *pszTemp; ++pszTemp)
   #endif

   ...
				
zpřístupnění kód snadněji číst, aplikace by definovat makra funkcí AnsiNext() a AnsiPrev() Pokud DBCS není definován:
   #ifndef DBCS

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

   #ifdef WIN31

   #define IsDBCSLeadByte(x) (FALSE)

   #endif

   #endif
				
s tyto definice všechny kód může být napsán pro DBCS. Poznámka: funkce AnsiNext() přejde není za koncem řetězec a funkce AnsiPrev() není přejde minulosti začátku řetězce, zatímco makra bude. Protože parametr "y" v makro AnsiPrev() ignorovány, bude umožňovat některé kód navíc různé výsledky při zkompilovány s a bez DBCS definované. Následující kód je příkladem tento phenomenon:
   pszEnd = AnsiPrev(++pszStart, pszEnd);
				
následující kód demonstruje najít posun název souboru úplnou cestu název:
   LPSTR GetFilePtr(LPSTR lpszFullPath)
   {

    LPSTR lpszFileName;

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

    return lpszFileName;

   }
				
Poznámka, které ': 'a' \\ ' je zaručena není zájemce bajtů. Hledání spuštěno od začátku řetězec spíše než koncové Vyhněte se použití funkce AnsiPrev().

Následující kód demonstruje kopie řetězec do omezenou velikost vyrovnávací paměti. Poznámka: zajistí, že řetězec nemá na konci vedoucí bajt.
   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;

   }
				

Vlastnosti

ID článku: 75439 - Poslední aktualizace: 13. února 2014 - Revize: 1.1
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Windows Software Development Kit 3.1
Klíčová slova: 
kbnosurvey kbarchive kbmt kb16bitonly kbinfo KB75439 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:75439

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