INFORMACIÓN: Sugerencias para escribir aplicaciones compatibles con DBCS

Seleccione idioma Seleccione idioma
Id. de artículo: 75439 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
3.00 3.10 WINDOWS kbprg
Expandir todo | Contraer todo

Resumen

Operaciones de cadena en sistemas que utilicen un conjunto de caracteres de doble byte (DBCS) son ligeramente diferentes de un sistema de caracteres de byte único. Este artículo ofrece directrices para reducir el trabajo necesario para trasladar una aplicación escrita para un sistema de byte a un sistema DBCS.

Más información

En un conjunto de caracteres de doble byte, algunos caracteres requieren dos bytes, mientras que algunos requieren sólo un byte. El controlador de lenguaje puede distinguir entre estos dos tipos de caracteres mediante la designación algunos caracteres como "bytes iniciales". Un byte inicial estará seguido por otra byte (un "byte final") para crear un carácter de doble byte (DBC). El conjunto de bytes de cliente potencial es diferente para cada idioma. Siempre se garantiza que los bytes de cliente potencial se caracteres extendidos; no caracteres ASCII de 7 bits pueden ser bytes iniciales. El byte de cola puede ser cualquier byte excepto un byte NULL. El final de una cadena siempre se define como el primer byte NULL de la cadena. Bytes iniciales son bytes de cola legal; la única forma para indicar si un byte actúa como un byte inicial es desde el contexto.

Windows Software Development Kit (SDK) versión 3.0 incluye dos funciones para moverse por las cadenas que pueden contener DBCs: AnsiNext() y AnsiPrev() . La función de AnsiPrev() es una llamada costoso tiempo porque debe ejecutarse a través de la cadena desde el principio para determinar dónde empieza el carácter anterior. Es mejor buscar caracteres desde el principio en lugar de final de una cadena.

El SDK de Windows versión 3.1 incluye la función IsDBCSLeadByte() , que devuelve TRUE si y sólo si el byte puede ser un byte inicial. Dado que esta función toma un char parámetro, no puede notificar si el byte es un byte inicial (para ello sería necesario contexto).

Para que el código que no sean DBCS que se ejecute tan rápido como sea posible, un archivo de código fuente puede utilice "# ifdef DBCS" alrededor de código sólo para DBCS y compilar dos versiones del archivo objeto (OBJ). Por ejemplo:
   #ifdef DBCS
     for (pszTemp = szString; *pszTemp; pszTemp = AnsiNext(pszTemp))
   #else
     for (pszTemp = szString; *pszTemp; ++pszTemp)
   #endif

   ...
				
para que sea más fácil de leer el código, una aplicación podría definir macros de las funciones AnsiNext() y AnsiPrev() si no está definido DBCS:
   #ifndef DBCS

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

   #ifdef WIN31

   #define IsDBCSLeadByte(x) (FALSE)

   #endif

   #endif
				
con estas definiciones en su lugar, todo el código puede escribirse para DBCS. Tenga en cuenta que la función AnsiNext() no irá más allá del final de una cadena y la función AnsiPrev() no irá más allá del principio de una cadena, mientras las macros. Además, porque se omite el parámetro "y" en la macro AnsiPrev() , algún código dará resultados diferentes cuando se compila con y sin DBCS definido. El código siguiente es un ejemplo de este fenómeno:
   pszEnd = AnsiPrev(++pszStart, pszEnd);
				
el código siguiente muestra cómo buscar el desplazamiento del nombre de archivo en un nombre de ruta completa:
   LPSTR GetFilePtr(LPSTR lpszFullPath)
   {

    LPSTR lpszFileName;

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

    return lpszFileName;

   }
				
tenga en cuenta que ': 'y' \\ ' se garantiza que los bytes de cliente potencial. La búsqueda se inicia desde el principio de la cadena en lugar de evitar el uso de la función AnsiPrev() final.

En el código siguiente se muestra una copia de cadena en un búfer de tamaño limitado. Tenga en cuenta que garantiza que la cadena no termina con un byte inicial.
   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;

   }
				

Propiedades

Id. de artículo: 75439 - Última revisión: viernes, 7 de febrero de 2014 - Versión: 1.1
La información de este artículo se refiere a:
  • Microsoft Windows Software Development Kit 3.1
Palabras clave: 
kbnosurvey kbarchive kbmt kb16bitonly kbinfo KB75439 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 75439

Enviar comentarios

 

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