Modifiche di ordinamento NLS

Piattaforme interessate

Client - Windows XP, Windows Vista, Windows 7
Server - Windows Server 2003, Windows Server 2008, Windows Server 2008 R2

Impatto sulle funzionalità

Gravità - Alto
Frequenza - Bassa (poche app interessate, ma se interessata, sempre interrotta)

Descrizione

Le funzioni National Language Support (NLS) consentono alle applicazioni di supportare le diverse esigenze di lingua e impostazioni locali specifiche degli utenti in tutto il mondo. Le nuove versioni di Windows includono quasi invariabilmente le modifiche NLS. Questa modifica influisce sulle regole di confronto e sull'ordinamento e quindi sulle applicazioni con indici persistenti.

Una tabella delle regole di confronto include due numeri che identificano la versione (revisione): la versione definita e la versione NLS. Entrambe le versioni sono valori DWORD, costituiti da una versione principale e una versione secondaria. Il primo byte di un valore è riservato, i due byte successivi rappresentano la versione principale e l'ultimo byte rappresenta la versione secondaria. In termini esadecimali, il modello è 0xRRMMMMmm, dove R è uguale a Riservato, M uguale a principale e m è minore. Ad esempio, una versione principale di 3 con una versione secondaria di 4 è rappresentata come 0x304.

Per una versione principale, uno o più punti di codice cambiano in modo che l'applicazione debba ricompilare tutti i dati per i confronti da valida. Per una versione secondaria, non viene spostato nulla, ma i punti di codice vengono aggiunti. Per questo tipo di versione, l'applicazione deve eseguire di nuovo l'indicizzazione delle stringhe con valori precedentemente non eseguibili. Di seguito è riportato il significato dei numeri di versione in relazione alle modifiche dei dati nelle tabelle di eccezioni specifiche delle impostazioni locali e nelle tabelle predefinite:

NLSVersion Major : punti di codice modificati nelle tabelle specifiche delle impostazioni locali o "eccezioni"
NLSVersion Minor : aggiunta di nuovi punti di codice nelle tabelle specifiche delle impostazioni locali o "eccezioni"
DefinedVersion Major - Punti di codice modificati nella tabella predefinita
DefinedVersion Minor : aggiunta di nuovi punti di codice nella tabella predefinita

Ordinamento dei numeri di versione per le versioni rilasciate:

Sistema operativo Versione Versione (0xRRMMMMmm)
Windows XP RTM/SP1/SP2/SP3/... N/A - nessuna 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

 

Manifestazione

Le applicazioni (ad esempio i database) con indici persistenti che non controllano la versione NLS e re-index al momento della modifica della versione non riusciranno a ordinare correttamente o potrebbero non riuscire a fornire risultati richiesti.

Nel caso delle interfacce utente, gli elenchi ,ad esempio alfabetici, numerici, alfanumerici, simboli e così via, possono ordinare in modo errato.

Soluzione

L'applicazione può chiamare GetNLSVersionEx (Windows Vista o versione successiva) o GetNLSVersion (prima di Windows Vista) per recuperare sia la versione definita che la versione NLS per una tabella delle regole di confronto.

  • GetNLSVersionEx:

Recupera informazioni sulla versione corrente di una funzionalità NLS specificata per le impostazioni locali specificate dal nome
Questa funzione consente a un'applicazione come Active Directory di determinare se una modifica NLS influisce sulle impostazioni locali usate per una determinata tabella di indice. In caso contrario, non è necessario ricompilare la tabella. Per altre informazioni, vedere Gestione delle impostazioni locali e delle informazioni sulla lingua.
Questa funzione supporta impostazioni locali personalizzate. Se lpLocaleName specifica impostazioni locali supplementari, i dati recuperati sono i dati corretti per l'ordine di confronto associato a tale impostazione locale supplementare.

Nota: Le versioni di Windows precedenti a Windows Vista non supportano GetNLSVersionEx.

  • GetNLSVersion (uso per le applicazioni in esecuzione in versioni di Windows prima di Windows Vista):

Recupera informazioni sulla versione corrente di una funzionalità NLS specificata per le impostazioni locali specificate dall'identificatore
Questa funzione consente a un'applicazione come Active Directory di determinare se una modifica NLS influisce sull'identificatore delle impostazioni locali utilizzato per una determinata tabella di indice. In caso contrario, non è necessario ricompilare la tabella. Per altre informazioni, vedere Gestione delle impostazioni locali e delle informazioni sulla lingua.
Nota: Questa funzione recupera informazioni solo sulle impostazioni locali specificate dall'identificatore. La funzione GetNLSVersionEx supporta impostazioni locali, funzionalità e nomi RFC 4646 aggiuntivi. Tuttavia, le versioni di Windows precedenti a Windows Vista non supportano GetNLSVersionEx.
Le applicazioni destinate a essere eseguite solo in Windows Vista e versioni successive devono usare GetNLSVersionEx in preferenza per questa funzione. GetNLSVersionEx offre un supporto valido per le impostazioni locali supplementari.

Test di compatibilità

Passaggi per indicare se è stata modificata una versione delle regole di confronto, ovvero è necessario ri-indicizzare):

  • Usare GetNLSVersionEx() per recuperare una struttura NLSVERSIONINFOEX durante l'indicizzazione originale dei dati.

  • Archiviare le proprietà seguenti con l'indice per identificare la versione: NLSVERSIONINFOEX.dwNLSVersion e NLSVERSIONINFOEX.dwDefinedVersion : queste due proprietà specificano insieme la versione della tabella di ordinamento in uso.
    NLSVERSIONINFOEX.dwEffectiveId : specifica le impostazioni locali effettive dell'ordinamento. Le impostazioni locali personalizzate puntano all'ordinamento delle impostazioni locali in box.

  • Quando si usa l'indice, usare GetNlsVersionEx() per individuare la versione dei dati.

  • Se una delle tre proprietà è stata modificata, i dati di ordinamento usati potrebbero restituire risultati diversi e qualsiasi indicizzazione potrebbe non riuscire a trovare i record.

  • Se si CONOSCE che i dati non contengono punti di codice Unicode non validi, ovvero tutte le stringhe restituite TRUE da una chiamata a IsNLSDefinedString(), è possibile considerarle uguali se SOLO il byte basso di dwNLSVersion e dwDefinedVersion è stato modificato (le versioni secondarie descritte in precedenza).