BILGI: DBCS uyumlu uygulamaları yazma için arama ipuçları

ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.

75439
Bu makale arşivlenmiştir. "Olduğu gibi" sunulmaktadır ve bundan sonra güncelleştirilmeyecektir.
3.00 3.10 WINDOWS kbprg
Özet
Dize işlemleri bir çift baytlık karakter kümesi (DBCS) kullanan sistemlerde, tek baytlı karakter sistemden biraz farklıdır. Bu makalede, bir DBCS sisteme tek baytlık bir sistem için yazılmış olan bir uygulama bağlantı noktası için gerekli olan çalışma azaltmak için yönergeler sağlar.
Daha fazla bilgi
Çift baytlı karakter kümesinde, bazı karakterler iki bayt gerektirir, karşın, bazıları yalnızca tek bir bayt gerektirir. Dil sürücüsü bu karakter, bazı karakterler "müşteri adayı bayt" olarak belirleme tarafından iki tür ayırt edebilirsiniz Bir müşteri adayı bayt çift baytlık karakter (DBC) oluşturmak için başka bir bayt ile (bir "kuyruğu bayt") izler. Müşteri adayı bayt kümesi her dil için farklıdır. Müşteri adayı bayt her zaman genişletilmiş karakterler alınabileceğine; 7 bit ASCII karakter, müşteri adayı bayt olabilir. Kuyruk bayt BOş bayt dışındaki herhangi bir bayt olabilir. Bir dizenin sonuna, her zaman dizedeki ilk BOş bayt olarak tanımlanır. Müşteri adayı bayt yasal kuyruğu bayt; bir bayt baytı davranıyorsa bildirmek için tek içerik yoludur.

Windows Software Development Kit'e (SDK) sürüm 3.0, DBCs içeren dizeler arasında taşımak için iki işlev bulunur: AnsiNext() ve AnsiPrev(). AnsiPrev() işlevi zaman pahalı bir çağrı çünkü önceki karakteri başladığı yeri belirlemek için en baştan dizesi ile çalıştırmalısınız. Bir dizenin son yerine başına karakterleri aramak uygundur.

Windows SDK (sürüm 3.1 bayt baytı BE ise ve yalnızca, DOğRU verir IsDBCSLeadByte() işlevini içerir. Bu işlev, bir char kaplayacağından parametresi, bayt (Bunu yapmak için içerik gerekir) baytı IS, raporlanamıyor.

Olmayan DBCS kodun olabildiğince hızlı bir şekilde çalışmak için <a0></a0>, bir kaynak dosyası "#ifdef DBCS" yalnızca DBCS için kod geçici kullanın ve <a1>Nesne</a1> (OBJ) dosyası iki sürümü derleyin. Örneğin:
   #ifdef DBCS     for (pszTemp = szString; *pszTemp; pszTemp = AnsiNext(pszTemp))   #else     for (pszTemp = szString; *pszTemp; ++pszTemp)   #endif   ...				
DBCS tanımlanmamışsa, kodun daha kolay okunmasını sağlamak için <a0></a0>, bir uygulama AnsiNext() ve AnsiPrev() işlevleri için makrolar tanımlayabilirsiniz:
   #ifndef DBCS   #define AnsiNext(x) ((x)+1)   #define AnsiPrev(y, x) ((x)-1)   #ifdef WIN31   #define IsDBCSLeadByte(x) (FALSE)   #endif   #endif				
yerinde bu tanımları ile tüm kodu için DBCS yazılabilir. AnsiNext() işlev bir dize sonunun gidin ve makroları eder durumdayken AnsiPrev() işlev bir dize başlangıcı önceki gidecek unutmayın. Buna ek olarak, AnsiPrev() makroda "y" parametresi yok sayılır, çünkü bazı kodu olan ve olmayan tanımlanan DBCS derlenmiş, farklı sonuçlar verir. Aşağıdaki kod, bu phenomenon bir örnektir:
   pszEnd = AnsiPrev(++pszStart, pszEnd);				
aşağıdaki kod, mahsup hesabı'dosya adı, bir tam yol adını bulmak gösterilmiştir:
   LPSTR GetFilePtr(LPSTR lpszFullPath)   {    LPSTR lpszFileName;    for (lpszFileName = lpszFullPath; *lpszFullPath;               lpszFullPath = AnsiNext(lpszFullPath))        if (*lpszFullPath == ':' || *lpszFullPath == '\\')            lpszFileName = lpszFullPath + 1;    return lpszFileName;   }				
, Not ': 've' \\ ' müşteri adayı bayt olmasını garanti altına alınmıştır. Arama dizesi çok AnsiPrev() işlevini kullanmaktan kaçınmaktır sonuna başından başlatıldı.

Aşağıdaki kod, sınırlı boyut arabellek içinde bir dize kopyasını gösterir. Not dize baytı ile bitmez sağlar.
   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.00 3.10

Uyarı: Bu makalenin çevirisi otomatik olarak yapılmıştır

Özellikler

Makale No: 75439 - Son İnceleme: 02/02/2014 08:41:10 - Düzeltme: 1.1

  • Microsoft Windows Software Development Kit 3.1
  • kbnosurvey kbarchive kbmt kb16bitonly kbinfo KB75439 KbMttr
Geri bildirim