إن المستعرض الذي تستخدمه غير معتمد

إنك تحتاج إلى تحديث المستعرض لاستخدام الموقع.

التحديث إلى أحدث إصدار من Internet Explorer

INFO: تلميحات الكتابة للتطبيقات المتوافقة مع DBCS

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

اضغط هنا لرابط المقالة باللغة الانجليزية75439
تمت أرشفة هذه المقالة. وتظهر "كما هي" ولن يتم تحديثها بعد الآن.
3.00 3.10 kbprg WINDOWS
الموجز
تعتبر العمليات سلسلة في الأنظمة التي تستخدم بايت مزدوج "الأحرف مجموعة" (DBCS) مختلف قليلاً من نظام أحرف أحادية البايت. توفر هذه المقالة إرشادات تقليل العمل الضرورية المنفذ أحد تطبيقات المكتوبة من أجل نظام بايت واحد إلى نظام DBCS.
معلومات أخرى
في مجموعة أحرف مزدوجة البايت تتطلب بعض الأحرف وحدتي بايت بينما تتطلب بعض بايت واحد فقط. يمكن برنامج تشغيل لغة التمييز بين هذين النوعين من الأحرف عن طريق تعيين بعض الأحرف كـ "وحدات البايت المتوقع". سوف أن يتبع بايت تداخل بايت آخر ("خلفي بايت") لإنشاء حرف بايت مزدوج على (DBC). يختلف تعيين العميل المتوقع بايت لكل لغة. دوماً من ضمان أن بايت تداخل يمكن توسيع أحرف; ويمكن أن أية أحرف ASCII 7 بت بايت تداخل. قد يكون البايت خلفي أي بايت باستثناء بايت NULL. يتم تعريف نهاية سلسلة دائماً على أنها البايت NULL الأول في السلسلة. يتم تداخل بايت بايت خلفي القانونية; الطريقة الوحيدة لمعرفة ما إذا كان بايت بدور إلى بايت تداخل من السياق.

يتضمن برامج تطوير Kit (SDK) Windows الإصدار 3.0 وظائف جهازي للتنقل خلال سلاسل قد تتضمن DBCs: AnsiNext() و AnsiPrev(). دالة AnsiPrev() لأنه مكالمة تكلفة وقت يجب أن تعمل عبر السلسلة من البداية لتحديد حيث يبدأ الحرف السابق. من الأفضل البحث عن الأحرف من البداية بدلاً من نهاية سلسلة.

يتضمن SDK Windows الإصدار 3.1 الدالة IsDBCSLeadByte() إرجاع TRUE إذا و فقط إذا الممكن تكون البايت بايت المتوقع. لأن تحتاج هذه الدالة على char المعلمة, فإنه يتعذر تقرير إذا البايت IS بايت تداخل (للقيام بذلك قد تتطلب السياق).

لجعل رمز غير DBCS تعمل بسرعة قدر الإمكان في ملف مصدر قد استخدم "#ifdef DBCS" حول التعليمات البرمجية التي يتم فقط من أجل DBCS ثم ترجمة إصدارين من ملف الكائن (OBJ). على سبيل المثال:
   #ifdef DBCS     for (pszTemp = szString; *pszTemp; pszTemp = AnsiNext(pszTemp))   #else     for (pszTemp = szString; *pszTemp; ++pszTemp)   #endif   ...				
لإنشاء التعليمات البرمجية سهلة القراءة تطبيق قد تعريف وحدات ماكرو الوظائف AnsiNext() و AnsiPrev() إذا لم يتم تعريف DBCS:
   #ifndef DBCS   #define AnsiNext(x) ((x)+1)   #define AnsiPrev(y, x) ((x)-1)   #ifdef WIN31   #define IsDBCSLeadByte(x) (FALSE)   #endif   #endif				
مع هذه التعريفات في مكان كافة التعليمات البرمجية يمكن كتابتها لـ DBCS. لاحظ أن الدالة AnsiNext() سيدخل لا نهاية سلسلة غير سوف ينتقل الدالة AnsiPrev() بعد بداية سلسلة بينما سوف وحدات الماكرو. بالإضافة إلى ذلك، لأن يتم تجاهل معلمة "y" في الماكرو AnsiPrev() ستعطي التعليمات البرمجية بعض نتائج مختلفة عند التحويل البرمجي مع وبدون DBCS تعريف. التعليمة البرمجية التالية مثال عن هذا phenomenon:
   pszEnd = AnsiPrev(++pszStart, pszEnd);				
تعمل التعليمة البرمجية التالي يوضح كيفية البحث عن إزاحة اسم الملف في اسم مسار كامل:
   LPSTR GetFilePtr(LPSTR lpszFullPath)   {    LPSTR lpszFileName;    for (lpszFileName = lpszFullPath; *lpszFullPath;               lpszFullPath = AnsiNext(lpszFullPath))        if (*lpszFullPath == ':' || *lpszFullPath == '\\')            lpszFileName = lpszFullPath + 1;    return lpszFileName;   }				
الملاحظات التي ': 'و' \\ ' يتم ضمان لا يمكن تداخل بايت. بدء البحث من بداية السلسلة بدلاً من النهاية تجنب استخدام الدالة AnsiPrev().

توضح التعليمة البرمجية التالية نسخة سلسلة في المخزن مؤقت حجم محدودة. لاحظ أن يضمن أن لا ينتهي السلسلة بـ بايت المتوقع.
   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

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 75439 - آخر مراجعة: 02/10/2014 13:56:14 - المراجعة: 1.1

  • Microsoft Windows Software Development Kit 3.1
  • kbnosurvey kbarchive kbmt kb16bitonly kbinfo KB75439 KbMtar
تعليقات