ИНФОРМАЦИЯ: Советы по написанию DBCS-совместимых приложений

ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.

Эта статья на английском языке:75439
Заявление об отказе относительно содержимого статьи о продуктах, поддержка которых прекращена
Эта статья содержит сведения о продуктах, поддержка которых корпорацией Майкрософт прекращена. Поэтому она предлагается как есть и обновляться не будет.
3.00 3.10 WINDOWS kbprg
Аннотация
Операции со строками в системах, использующих двухбайтовые символ набора (DBCS) немного отличаются от системы однобайтовых знаков.Данная статья содержит рекомендации для снижения действия, необходимые для переноса приложений, написанных для однобайтовой системы к системе DBCS.
Дополнительная информация
В double-byte character set некоторые символы требуется два байта, а некоторые требуют только один байт. Драйвер языка можно различать эти два типа символов, указав некоторые символы, как «старшие байты». Ведущий байт будет следовать другой байтов («байт хвост») для создания символов двухбайтовые (DBC). Набор старшие байты, отличается для каждого языка. Старшие байты всегда гарантированно быть расширенные символы, 7-разрядные символы ASCII не может быть старшие байты. Tail байтов может быть любой байт, за исключением байт NULL. Конец строки всегда определяется как первый байт NULL в строке. Старшие байты, юридические заключительного байт, единственным способом определить, если байт выступает в качестве старшего байта из контекста.

Windows Software Development Kit (SDK) версии 3.0 включает две функции для перемещения по строки, которые могут содержать DBCs.AnsiNext()иAnsiPrev(). надписьюAnsiPrev()функция является дорогим время вызова, так как эта программа должна выполняться по строке с самого начала, чтобы определить, где начинается предыдущий знак. Рекомендуется для поиска символов из начала, а не в конец строки.

Включает в себя пакет для Windows версии 3.1IsDBCSLeadByte()функция возвращает значение 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. Ниже приведен пример это явление.
   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()function:.

В следующем коде показано копию строки в ограниченный размер буфера. Обратите внимание, что гарантирует, что строка не оканчивается старшего байта.
   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 — последний просмотр: 11/08/2010 19:32:00 — редакция: 2.0

Microsoft Windows Software Development Kit 3.1

  • kb16bitonly kbinfo kbmt KB75439 KbMtru
Отзывы и предложения