Alterações de classificação de NLS

Plataformas afetadas

Clientes – Windows XP, Windows Vista, Windows 7
Servidores – Windows Server 2003, Windows Server 2008, Windows Server 2008 R2

Impacto do recurso

Severidade – Alta
Frequência - Baixo (poucos aplicativos afetados, mas se afetados, sempre quebrados)

Descrição

As funções de NLS (Suporte à Linguagem Nacional) ajudam os aplicativos a dar suporte às diferentes necessidades específicas de idioma e localidade dos usuários em todo o mundo. As novas versões do Windows quase invariavelmente incluem alterações de NLS. Essa alteração afeta a ordenação e a classificação e, portanto, aplicativos que têm índices persistentes.

Uma tabela de ordenação tem dois números que identificam sua versão (revisão): a versão definida e a versão do NLS. Ambas as versões são valores DWORD, compostos por uma versão principal e uma versão secundária. O primeiro byte de um valor é reservado, os dois próximos bytes representam a versão principal e o último byte representa a versão secundária. Em termos hexadecimal, o padrão é 0xRRMMMMmm, em que R é igual a Reservado, M é igual a major e m é igual a menor. Por exemplo, uma versão principal de 3 com uma versão secundária de 4 é representada como 0x304.

Para uma versão principal, um ou mais pontos de código são alterados para que o aplicativo precise indexar novamente todos os dados para que as comparações sejam válidas. Para uma versão secundária, nada se move, mas os pontos de código são adicionados. Para esse tipo de versão, o aplicativo só precisa indexar novamente cadeias de caracteres com valores não variados anteriormente. Em resumo, aqui está o que os números de versão significam em relação às alterações de dados nas tabelas de exceção específicas da localidade e nas tabelas padrão:

NLSVersion Major – pontos de código alterados nas tabelas "exceção" ou específicas da localidade
NLSVersion Minor – adicionados novos pontos de código nas tabelas "exception" ou específicas da localidade
DefinedVersion Major – pontos de código alterados na tabela padrão
DefinedVersion Minor – adicionados novos pontos de código na tabela padrão

Classificação de números de versão para versões lançadas:

Sistema operacional Versão Versão (0xRRMMMMmm)
Windows XP RTM/SP1/SP2/SP3/... N/A – nenhuma 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

 

Manifestação

Aplicativos (como bancos de dados) com índices persistentes que não marcar a versão do NLS e o reindexão após a alteração da versão falharão na classificação correta ou poderão falhar ao fornecer os resultados solicitados.

No caso de interfaces do usuário, listas (por exemplo, alfabéticas, numéricas, alfanuméricas, símbolos e assim por diante) podem ser classificadas incorretamente.

Solução

Seu aplicativo pode chamar GetNLSVersionEx (Windows Vista ou posterior) ou GetNLSVersion (antes do Windows Vista) para recuperar a versão definida e a versão do NLS para uma tabela de ordenação.

  • GetNLSVersionEx:

Recupera informações sobre a versão atual de um recurso de NLS especificado para uma localidade especificada pelo nome
Essa função permite que um aplicativo como o Active Directory determine se uma alteração de NLS afeta a localidade usada para uma tabela de índice específica. Se isso não acontecer, não será necessário indexar novamente a tabela. Para obter mais informações, consulte Manipulando informações de localidade e idioma.
Essa função dá suporte a localidades personalizadas. Se lpLocaleName especificar uma localidade suplementar, os dados recuperados serão os dados corretos para a ordem de ordenação associada a essa localidade suplementar.

Nota: Versões do Windows anteriores ao Windows Vista não dão suporte a GetNLSVersionEx.

  • GetNLSVersion (uso para aplicativos em execução em versões do Windows antes do Windows Vista):

Recupera informações sobre a versão atual de um recurso de NLS especificado para uma localidade especificada pelo identificador
Essa função permite que um aplicativo como o Active Directory determine se uma alteração de NLS afeta o identificador de localidade usado para uma tabela de índice específica. Se isso não acontecer, não será necessário indexar novamente a tabela. Para obter mais informações, consulte Manipulando informações de localidade e idioma.
Nota: Essa função recupera informações apenas sobre uma localidade especificada pelo identificador. A função GetNLSVersionEx dá suporte a locais, recursos e nomes adicionais do RFC 4646. No entanto, as versões do Windows anteriores ao Windows Vista não dão suporte a GetNLSVersionEx.
Os aplicativos destinados a serem executados somente no Windows Vista e posteriores devem usar GetNLSVersionEx em preferência para essa função. GetNLSVersionEx fornece um bom suporte para localidades complementares.

Teste de compatibilidade

Etapas para saber se uma versão de ordenação foi alterada (ou seja, você precisa indexar novamente):

  • Use GetNLSVersionEx() para recuperar uma estrutura NLSVERSIONINFOEX ao fazer a indexação original de seus dados.

  • Armazene as seguintes propriedades com seu índice para identificar a versão: NLSVERSIONINFOEX.dwNLSVersion e NLSVERSIONINFOEX.dwDefinedVersion – essas duas propriedades especificam juntas a versão da tabela de classificação que você está usando.
    NLSVERSIONINFOEX.dwEffectiveId – especifica a localidade efetiva da sua classificação. Uma localidade personalizada apontará para a classificação de uma localidade in-box.

  • Ao usar o índice, use GetNlsVersionEx() para descobrir a versão de seus dados.

  • Se qualquer uma das três propriedades tiver sido alterada, os dados de classificação que você está usando poderão retornar resultados diferentes e qualquer indexação que você tiver poderá não encontrar registros.

  • Se você souber que seus dados não contêm pontos de código Unicode inválidos (ou seja, todas as cadeias de caracteres retornaram TRUE de uma chamada para IsNLSDefinedString()), você poderá considerá-los da mesma forma se APENAS o byte baixo de dwNLSVersion e dwDefinedVersion for alterado (as versões secundárias descritas acima).