INFO: Dicas para gravar aplicativos DBCS compatíveis

Traduções deste artigo Traduções deste artigo
ID do artigo: 75439 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
3,00 3.10 Kbprg do WINDOWS
Expandir tudo | Recolher tudo

Sumário

Operações de seqüência de caracteres em sistemas que usam um Double-Byte conjunto de caracteres (DBCS) são ligeiramente diferentes de um caractere de byte único sistema. Este artigo fornece diretrizes para reduzir o trabalho necessário para portar um aplicativo escrito para um sistema de byte único para um sistema DBCS.

Mais Informações

Em um conjunto de caracteres de dois bytes, alguns caracteres exigem dois bytes, enquanto alguns requerem apenas um byte. O driver de idioma pode distinguir entre esses dois tipos de caracteres designando alguns caracteres como "bytes de cliente potencial". Um byte será seguido por outra bytes (uma "bytes de cauda") para criar um caractere de dois bytes (DBC). O conjunto de bytes de cliente potencial é diferente para cada idioma. Bytes de avanço sempre são garantidas como ser caracteres estendidos; caracteres ASCII de 7 bits podem ser bytes do cliente potencial. O byte final pode ser qualquer byte, exceto um byte NULL. Final de uma seqüência de caracteres é sempre definido como o primeiro byte NULL na seqüência de caracteres. Bytes de clientes potenciais são legais cauda bytes; a única maneira de dizer se um byte está atuando como um byte é do contexto.

O SDK (Windows Software Development Kit) versão 3.0 inclui duas funções para mover através de seqüências de caracteres que podem conter DBCs: AnsiNext() e AnsiPrev() . A função AnsiPrev() é uma chamada de tempo cara porque ele deve ser executado por meio da seqüência de caracteres desde o início para determinar onde começa o caractere anterior. É melhor procurar por caracteres de início em vez de final de uma seqüência de caracteres.

O SDK do Windows versão 3.1 inclui a função IsDBCSLeadByte() , que retorna VERDADEIRO se e somente se o byte pode ser um byte. Porque esta função usa um caractere parâmetro, ele não é possível informar se o byte é um byte (fazer isso seria exigem contexto).

Para tornar não-DBCS código executado mais depressa possível, um arquivo de origem pode usar "# ifdef DBCS" ao redor de código que é somente para o DBCS e compilar duas versões de arquivo do objeto (OBJ). Por exemplo:
   #ifdef DBCS
     for (pszTemp = szString; *pszTemp; pszTemp = AnsiNext(pszTemp))
   #else
     for (pszTemp = szString; *pszTemp; ++pszTemp)
   #endif

   ...
				
para que o código mais fácil de ler, um aplicativo poderia definir macros para as funções AnsiNext() e AnsiPrev() se DBCS não estiver definido:
   #ifndef DBCS

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

   #ifdef WIN31

   #define IsDBCSLeadByte(x) (FALSE)

   #endif

   #endif
				
com essas definições no lugar, todo o código pode ser escrito para DBCS. Observe que a função AnsiNext() não irá após o final de uma seqüência de caracteres e a função AnsiPrev() não irá após o início de uma seqüência de caracteres, enquanto as macros serão. Além disso, porque o parâmetro "y" na macro AnsiPrev() é ignorado, alguns códigos fornecerão resultados diferentes quando compilado com e sem DBCS definido. O código a seguir é um exemplo desse fenômeno:
   pszEnd = AnsiPrev(++pszStart, pszEnd);
				
o seguinte código demonstra como localizar o deslocamento do nome do arquivo em um nome de caminho completo:
   LPSTR GetFilePtr(LPSTR lpszFullPath)
   {

    LPSTR lpszFileName;

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

    return lpszFileName;

   }
				
Observação que ': 'e' \\ ' são garantidas não como bytes de cliente potencial. A pesquisa iniciada desde o início da seqüência de caracteres em vez de final para evitar o uso a função AnsiPrev() .

O código a seguir demonstra uma cópia de seqüência de caracteres em um buffer de tamanho limitado. Observe que ele garante que a seqüência de caracteres não termina com um byte.
   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;

   }
				

Propriedades

ID do artigo: 75439 - Última revisão: segunda-feira, 7 de outubro de 2013 - Revisão: 1.1
A informação contida neste artigo aplica-se a:
  • Microsoft Windows Software Development Kit 3.1
Palavras-chave: 
kbnosurvey kbarchive kbmt kb16bitonly kbinfo KB75439 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 75439

Submeter comentários

 

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