Partager via


Modifications de tri NLS

Plateformes affectées

Clients - Windows XP, Windows Vista, Windows 7
Serveurs - Windows Server 2003, Windows Server 2008, Windows Server 2008 R2

Impact sur les fonctionnalités

Gravité - Élevée
Fréquence - Faible (peu d’applications impactées, mais si elles sont impactées, toujours cassées)

Description

Les fonctions NLS (National Language Support) aident les applications à prendre en charge les différents besoins spécifiques à la langue et aux paramètres régionaux des utilisateurs du monde entier. Les nouvelles versions de Windows incluent presque invariablement des modifications NLS. Cette modification affecte le classement et le tri, et donc les applications qui ont des index persistants.

Une table de classement a deux nombres qui identifient sa version (révision) : la version définie et la version NLS. Les deux versions sont des valeurs DWORD, composées d’une version majeure et d’une version mineure. Le premier octet d’une valeur est réservé, les deux octets suivants représentent la version principale et le dernier octet représente la version mineure. En termes hexadécimaux, le modèle est de 0xRRMMMMmm, où R est égal à Réservé, M à majeur et m à mineur. Par exemple, une version majeure de 3 avec une version mineure de 4 est représentée comme 0x304.

Pour une version majeure, un ou plusieurs points de code changent de sorte que l’application doit réindexer toutes les données pour que les comparaisons soient valides. Pour une version mineure, rien ne bouge, mais des points de code sont ajoutés. Pour ce type de version, l’application doit uniquement réindexer les chaînes avec des valeurs auparavant non triables. En résumé, voici ce que signifient les numéros de version par rapport aux modifications de données dans les tables d’exceptions spécifiques aux paramètres régionaux et les tables par défaut :

NLSVersion Major : points de code modifiés dans les tables « exception » ou spécifiques aux paramètres régionaux
NLSVersion mineure : ajout de nouveaux points de code dans les tables « exception » ou spécifiques aux paramètres régionaux
DefinedVersion Major : points de code modifiés dans la table par défaut
DefinedVersion Minor : ajout de nouveaux points de code dans la table par défaut

Tri des numéros de version pour les versions publiées :

Système d’exploitation Libérer Version (0xRRMMMMmm)
Windows XP RTM/SP1/SP2/SP3/... N/A - aucune 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

 

Manifestation

Les applications (telles que les bases de données) avec des index persistants qui ne case activée pas la version NLS et réindexent en cas de changement de version ne parviennent pas à trier correctement ou peuvent ne pas fournir les résultats demandés.

Dans le cas des interfaces utilisateur, les listes (par exemple, alphabétiques, numériques, alphanumériques, symboles, etc.) peuvent être mal triées.

Solution

Votre application peut appeler GetNLSVersionEx (Windows Vista ou version ultérieure) ou GetNLSVersion (avant Windows Vista) pour récupérer à la fois la version définie et la version NLS pour une table de classement.

  • GetNLSVersionEx :

Récupère des informations sur la version actuelle d’une fonctionnalité NLS spécifiée pour un paramètre régional spécifié par nom
Cette fonction permet à une application telle qu’Active Directory de déterminer si une modification NLS affecte les paramètres régionaux utilisés pour une table d’index particulière. Si ce n’est pas le cas, il n’est pas nécessaire de réindexer la table. Pour plus d’informations, consultez Gestion des paramètres régionaux et des informations de langue.
Cette fonction prend en charge les paramètres régionaux personnalisés. Si lpLocaleName spécifie des paramètres régionaux supplémentaires, les données récupérées sont les données correctes pour l’ordre de classement associé à ces paramètres régionaux supplémentaires.

Note: Les versions de Windows antérieures à Windows Vista ne prennent pas en charge GetNLSVersionEx.

  • GetNLSVersion (utilisé pour les applications s’exécutant sur des versions de Windows antérieures à Windows Vista) :

Récupère des informations sur la version actuelle d’une fonctionnalité NLS spécifiée pour un paramètre régional spécifié par identificateur
Cette fonction permet à une application telle qu’Active Directory de déterminer si une modification NLS affecte l’identificateur de paramètres régionaux utilisé pour une table d’index particulière. Si ce n’est pas le cas, il n’est pas nécessaire de réindexer la table. Pour plus d’informations, consultez Gestion des paramètres régionaux et des informations de langue.
Note: Cette fonction récupère uniquement des informations sur les paramètres régionaux spécifiés par l’identificateur. La fonction GetNLSVersionEx prend en charge des paramètres régionaux, des fonctionnalités et des noms RFC 4646 supplémentaires. Toutefois, les versions de Windows antérieures à Windows Vista ne prennent pas en charge GetNLSVersionEx.
Les applications destinées à s’exécuter uniquement sur Windows Vista et versions ultérieures doivent utiliser GetNLSVersionEx de préférence pour cette fonction. GetNLSVersionEx fournit une bonne prise en charge des paramètres régionaux supplémentaires.

Test de compatibilité

Étapes pour savoir si une version de classement a changé (autrement dit, vous devez réindexer) :

  • Utilisez GetNLSVersionEx() pour récupérer une structure NLSVERSIONINFOEX lors de l’indexation d’origine de vos données.

  • Stockez les propriétés suivantes avec votre index pour identifier la version : NLSVERSIONINFOEX.dwNLSVersion et NLSVERSIONINFOEX.dwDefinedVersion : ces deux propriétés spécifient ensemble la version de la table de tri que vous utilisez.
    NLSVERSIONINFOEX.dwEffectiveId : spécifie les paramètres régionaux effectifs de votre tri. Un paramètre régional personnalisé pointe vers le tri d’un paramètre régional dans la boîte de dialogue.

  • Lorsque vous utilisez l’index, utilisez GetNlsVersionEx() pour découvrir la version de vos données.

  • Si l’une des trois propriétés a changé, les données de tri que vous utilisez peuvent retourner des résultats différents et toute indexation que vous avez peut ne pas trouver d’enregistrements.

  • Si vous SAVEz que vos données ne contiennent pas de points de code Unicode non valides (c’est-à-dire que toutes vos chaînes retournées TRUE à partir d’un appel à IsNLSDefinedString()), vous pouvez les considérer de la même façon si uniquement l’octet faible de dwNLSVersion et dwDefinedVersion a changé (les versions mineures décrites ci-dessus).