INFO: Sugestões para escrever aplicações compatíveis com o DBCS

Traduções de Artigos Traduções de Artigos
Artigo: 75439 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
3.00 3.10 WINDOWS kbprg
Expandir tudo | Reduzir tudo

Sumário

Operações de cadeia em sistemas que utilizam uma-dois conjuntos de caracteres (DBCS) são ligeiramente diferentes de um sistema de caracteres de byte único. Este artigo fornece directrizes para reduzir o trabalho necessário para a porta de uma aplicação escrita para um sistema de byte único para um sistema DBCS.

Mais Informação

Num conjunto de caracteres de bytes duplos, alguns caracteres necessitam de dois bytes, enquanto que alguns requerem apenas um byte. O controlador de idioma pode distinguir entre estes dois tipos de caracteres, designando alguns caracteres como "cliente em potencial bytes". Um byte de cliente em potencial será seguido por outra byte (um "Cauda byte") para criar um caracteres de byte duplo (DBC). O conjunto de bytes de cliente em potencial é diferente para cada idioma. Bytes de cliente em potencial têm sempre a garantia de ser caracteres expandidos; existem caracteres ASCII de 7 bits podem ser bytes de cliente em potencial. O byte de seguimento pode ser qualquer byte excepto um byte NULL. Fim de uma cadeia sempre é definido como o primeiro byte NULL na cadeia. Bytes de cliente em potencial são legais Cauda bytes; a única forma de saber se um byte age como um byte de cliente em potencial é a partir do contexto.

O Windows Software Development Kit (SDK) versão 3.0 inclui duas funções para se mover através de cadeias que possam conter DBCs: AnsiNext() e AnsiPrev() . A função AnsiPrev() é uma chamada dispendiosa tempo porque tem executar através da cadeia de caracteres do início para determinar onde começa o carácter anterior. É melhor procurar caracteres do início em vez de fim de uma cadeia.

O SDK do Windows versão 3.1 inclui a função IsDBCSLeadByte() , que devolve VERDADEIRO se, e só se, o byte CAN ser um byte de cliente em potencial. Uma vez que esta função tem um carácter parâmetro, não consegue comunicar se o byte é um byte de cliente em potencial (para o fazer necessitaria contexto).

Para tornar código DBCS não executar o mais rapidamente possível, um ficheiro de origem pode utilizar "#ifdef DBCS" à volta de código que são apenas para DBCS e compilar duas versões do ficheiro de objecto (OBJ). Por exemplo:
   #ifdef DBCS
     for (pszTemp = szString; *pszTemp; pszTemp = AnsiNext(pszTemp))
   #else
     for (pszTemp = szString; *pszTemp; ++pszTemp)
   #endif

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

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

   #ifdef WIN31

   #define IsDBCSLeadByte(x) (FALSE)

   #endif

   #endif
				
com estas definições no local, todo o código pode ser escrito para DBCS. Note que a função AnsiNext() não irão depois do fim de uma cadeia de caracteres e a função AnsiPrev() não irão após o início de uma cadeia, enquanto as macros serão. Além disso, uma vez que o parâmetro "y" na macro AnsiPrev() é ignorado, algum código fornecerá resultados diferentes quando compilado com e sem DBCS definido. O código seguinte é um exemplo deste phenomenon:
   pszEnd = AnsiPrev(++pszStart, pszEnd);
				
o seguinte código demonstra como localizar o desvio de nome de ficheiro 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;

   }
				
nota que ': 'e' \\ ' não como bytes de cliente em potencial. Iniciar a procura desde o início da cadeia em vez de fim para evitar utilizar a função AnsiPrev() .

O seguinte código demonstra uma cópia de cadeia para uma memória intermédia de tamanho limitado. Tenha em atenção que garante que a cadeia não termina com um byte de cliente em potencial.
   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

Artigo: 75439 - Última revisão: 6 de fevereiro de 2014 - 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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