Cambios de ordenación de NLS
Plataformas afectadas
Clientes : Windows XP, Windows Vista, Windows 7
Servidores : Windows Server 2003, Windows Server 2008, Windows Server 2008 R2
Impacto en las características
Gravedad : alta
Frecuencia: baja (pocas aplicaciones afectadas, pero si se ven afectadas, siempre rotas)
Descripción
Las funciones de National Language Support (NLS) ayudan a las aplicaciones a admitir las diferentes necesidades específicas del idioma y la configuración regional de los usuarios de todo el mundo. Las nuevas versiones de Windows casi invariables incluyen cambios de NLS. Este cambio afecta a la intercalación y la ordenación, por lo que las aplicaciones que tienen índices persistentes.
Una tabla de intercalación tiene dos números que identifican su versión (revisión): la versión definida y la versión NLS. Ambas versiones son valores DWORD, compuestos de una versión principal y una versión secundaria. El primer byte de un valor está reservado, los dos bytes siguientes representan la versión principal y el último byte representa la versión secundaria. En términos hexadecimales, el patrón es 0xRRMMMMmm, donde R es igual a Reservado, M es igual a mayor y m es menor. Por ejemplo, una versión principal de 3 con una versión secundaria de 4 se representa como 0x304.
Para una versión principal, uno o varios puntos de código cambian para que la aplicación deba volver a indexar todos los datos para que las comparaciones sean válidas. Para una versión secundaria, no se mueve nada, pero se agregan puntos de código. Para este tipo de versión, la aplicación solo tiene que volver a indexar cadenas con valores no ordenados anteriormente. En resumen, este es el significado de los números de versión en relación con los cambios de datos en las tablas de excepciones específicas de la configuración regional y las tablas predeterminadas:
NLSVersion Principal : puntos de código modificados en las tablas "exception" o específicas de la configuración regional
NLSVersion Minor : se han agregado nuevos puntos de código en las tablas "exception" o específicas de la configuración regional.
DefinedVersion Major : puntos de código cambiados en la tabla predeterminada
DefinedVersion Minor : se han agregado nuevos puntos de código en la tabla predeterminada.
Ordenar los números de versión de las versiones publicadas:
Sistema operativo | Release | Versión (0xRRMMMMmm) |
---|---|---|
Windows XP | RTM/SP1/SP2/SP3/... | N/A: sin API GetNLSVersion() |
Windows Server 2003 | RTM/SP1 | 0x00 0000 01 |
Windows Vista | RTM/SP1 | 0x00 0405 00 |
Windows Server 2008 | RTM | 0x00 0501 00 / 0x00 5001 00 |
Windows 7 | RTM | 0x00060100 |
Manifestación
Las aplicaciones (como las bases de datos) con índices persistentes que no comprueban la versión nlS y vuelven a indexar tras el cambio de versión no se pueden ordenar correctamente o pueden no proporcionar resultados solicitados.
En el caso de las interfaces de usuario, las listas (por ejemplo, alfabéticas, numéricas, alfanuméricas, símbolos, etc.) pueden ordenarse incorrectamente.
Solución
La aplicación puede llamar a GetNLSVersionEx (Windows Vista o posterior) o GetNLSVersion (antes de Windows Vista) para recuperar tanto la versión definida como la versión NLS para una tabla de intercalación.
- GetNLSVersionEx:
Recupera información sobre la versión actual de una funcionalidad NLS especificada para una configuración regional especificada por nombre.
Esta función permite a una aplicación como Active Directory determinar si un cambio NLS afecta a la configuración regional usada para una tabla de índice determinada. Si no es así, no es necesario volver a indexar la tabla. Para obtener más información, consulte Control de la configuración regional e información de idioma.
Esta función admite configuraciones regionales personalizadas. Si lpLocaleName especifica una configuración regional complementaria, los datos recuperados son los datos correctos para el orden de intercalación asociado a esa configuración regional complementaria.
Nota: Las versiones de Windows anteriores a Windows Vista no admiten GetNLSVersionEx.
- GetNLSVersion (use para aplicaciones que se ejecutan en versiones de Windows anteriores a Windows Vista):
Recupera información sobre la versión actual de una funcionalidad NLS especificada para una configuración regional especificada por identificador.
Esta función permite a una aplicación como Active Directory determinar si un cambio nlS afecta al identificador de configuración regional usado para una tabla de índice determinada. Si no es así, no es necesario volver a indexar la tabla. Para obtener más información, consulte Control de la configuración regional e información de idioma.
Nota: Esta función recupera información solo sobre una configuración regional especificada por el identificador. La función GetNLSVersionEx admite configuraciones regionales, características y nombres RFC 4646 adicionales. Sin embargo, las versiones de Windows anteriores a Windows Vista no admiten GetNLSVersionEx.
Las aplicaciones diseñadas para ejecutarse solo en Windows Vista y versiones posteriores deben usar GetNLSVersionEx en preferencia para esta función.
GetNLSVersionEx proporciona una buena compatibilidad con configuraciones regionales complementarias.
Prueba de compatibilidad
Pasos para indicar si ha cambiado una versión de intercalación (es decir, debe volver a indexar):
Use GetNLSVersionEx() para recuperar una estructura NLSVERSIONINFOEX al realizar la indexación original de los datos.
Almacene las siguientes propiedades con el índice para identificar la versión: NLSVERSIONINFOEX.dwNLSVersion y NLSVERSIONINFOEX.dwDefinedVersion : estas dos propiedades especifican conjuntamente la versión de la tabla de ordenación que está usando.
NLSVERSIONINFOEX.dwEffectiveId : especifica la configuración regional efectiva de la ordenación. Una configuración regional personalizada apuntará a la ordenación de una configuración regional integrada.Al usar el índice, use GetNlsVersionEx() para detectar la versión de los datos.
Si alguna de las tres propiedades ha cambiado, los datos de ordenación que está usando podrían devolver resultados diferentes y cualquier indexación que haya podido no encontrar registros.
Si sabe que los datos no contienen puntos de código Unicode no válidos (es decir, todas las cadenas devueltas en TRUE desde una llamada a IsNLSDefinedString()), puede considerarlos iguales si SOLO cambia el byte bajo de dwNLSVersion y dwDefinedVersion (las versiones secundarias descritas anteriormente).
Vínculos a otros recursos
- Internacionalización para aplicaciones para Windows
- GetNLSVersionEx (función)
- GetNLSVersion (función)
- Cómo saber si la versión de intercalación ha cambiado