Aracılığıyla paylaş


NLS Sıralama Değişiklikleri

Etkilenen Platformlar

İstemciler - Windows XP, Windows Vista, Windows 7
Sunucuları - Windows Server 2003, Windows Server 2008, Windows Server 2008 R2

Özellik Etkisi

Önem Derecesi - Yüksek Derece
Sıklık - Düşük (etkilenen az sayıda uygulama, ancak etkileniyorsa, her zaman bozuk)

Açıklama

Ulusal Dil Desteği (NLS) işlevleri, uygulamaların dünyanın dört bir yanındaki kullanıcıların farklı dile ve yerel ayara özgü gereksinimlerini desteklemesine yardımcı olur. Yeni Windows sürümleri neredeyse her zaman NLS değişikliklerini içerir. Bu değişiklik harmanlamayı ve sıralamayı ve dolayısıyla kalıcı dizinleri olan uygulamaları etkiler.

Harmanlama tablosu, sürümünü (düzeltme) tanımlayan iki sayıya sahiptir: tanımlı sürüm ve NLS sürümü. Her iki sürüm de ana sürümden ve ikincil sürümden oluşan DWORD değerleridir. Bir değerin ilk baytı ayrılmıştır, sonraki iki bayt ana sürümü, son bayt ise ikincil sürümü temsil eder. Onaltılık terimlerle, desen 0xRRMMMMmm'dir; burada R ayrılmış, M büyük ve m küçük anlamına gelir. Örneğin, alt sürümü 4 olan 3'ün ana sürümü 0x304 olarak temsil edilir.

Ana sürümde bir veya daha fazla kod noktası değişir, böylece karşılaştırmaların geçerli olması için uygulamanın tüm verileri yeniden dizine alması gerekir. Küçük sürümde hiçbir şey değişmez, ancak kod noktaları eklenir. Bu tür bir sürüm için, uygulamanın yalnızca daha önce sıralanamayan değerlere sahip dizeleri yeniden indekslemesi gerekir. Özetle, yerel ayara özgü özel durum tablolarındaki ve varsayılan tablolardaki veri değişiklikleriyle ilgili olarak sürüm numaralarının anlamı şu şekildedir:

NLSVersion Major – 'özel durum' veya yerel ayara özgü tablolardaki kod noktaları değiştirildi
NLSVersion Minor – 'özel durum' veya yerel ayara özgü tablolarda yeni kod noktaları eklendi
DefinedVersion Major – Varsayılan tablodaki kod noktaları değiştirildi
DefinedVersion Minor – Varsayılan tabloya yeni kod noktaları eklendi

Yayımlanan sürümler için sürüm numaralarını sıralama:

İşletim Sistemi Salıverme Sürüm (0xRRMMMMmm)
Windows XP RTM/SP1/SP2/SP3/... Yok - GetNLSVersion() API'si yok
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

 

Tezahürü

NLS sürümünü denetlemeyen ve sürüm değişikliğinden sonra yeniden dizin oluşturmayan kalıcı dizinlere sahip uygulamalar (veritabanları gibi) doğru sıralama yapamaz veya istenen sonuçları sağlayamayabilir.

Kullanıcı arabirimleri söz konusu olduğunda listeler (örneğin alfabetik, sayısal, alfasayısal, simgeler vb.) yanlış sıralanabilir.

Çözüm

Uygulamanız, harmanlama tablosunun hem tanımlı sürümünü hem de NLS sürümünü almak için GetNLSVersionEx (Windows Vista veya üzeri) veya GetNLSVersion (Windows Vista'den önce) çağırabilir.

  • GetNLSVersionEx:

Adı belirtilen bir yerel ayar için belirtilen NLS özelliğinin mevcut sürümü hakkında bilgi alınır
Bu işlev, Active Directory gibi bir uygulamanın bir NLS değişikliğinin belirli bir dizin tablosu için kullanılan yerel ayarı etkileyip etkilemediğini belirlemesine olanak tanır. Aksi takdirde, tabloyu yeniden dizine almanız gerekmez. Daha fazla bilgi için bkz. Yerel Ayar ve Dil Bilgilerini İşleme.
Bu işlev özel yerel ayarları destekler. lpLocaleName ek bir yerel ayar belirtiyorsa, alınan veriler bu ek yerel ayar ile ilişkili harmanlama sırası için doğru verilerdir.

Not: Windows Vista'nın önceki Windows sürümleri GetNLSVersionEx'i desteklemez.

  • GetNLSVersion (Windows Vista öncesi Windows sürümlerinde çalışan uygulamalar için kullanın):

Tanımlayıcı tarafından belirtilen yerel ayar için belirtilen NLS özelliğinin geçerli sürümü hakkında bilgi alır
Bu işlev, Active Directory gibi bir uygulamanın bir NLS değişikliğinin belirli bir dizin tablosu için kullanılan yerel ayar tanımlayıcısını etkileyip etkilemediğini belirlemesine olanak tanır. Aksi takdirde, tabloyu yeniden dizine almanız gerekmez. Daha fazla bilgi için bkz. Yerel Ayar ve Dil Bilgilerini İşleme.
Not: Bu işlev yalnızca tanımlayıcı tarafından belirtilen bir yerel ayar hakkındaki bilgileri alır. GetNLSVersionEx işlevi ek yerel ayarları, özellikleri ve RFC 4646 adlarını destekler. Ancak, Windows Vista'nın önceki Windows sürümleri GetNLSVersionEx'i desteklemez.
Yalnızca Windows Vista ve sonraki sürümlerde çalışacak uygulamalar, bu işlev yerine GetNLSVersionEx kullanmalıdır. GetNLSVersionEx , ek yerel ayarlar için iyi destek sağlar.

Uyumluluk Testi

Harmanlama sürümünün değişip değişmediğini belirten adımlar (yani yeniden dizin oluşturmanız gerekir):

  • Verilerinizin özgün dizinini oluştururken NLSVERSIONINFOEX yapısını almak için GetNLSVersionEx() kullanın.

  • Sürümü tanımlamak için aşağıdaki özellikleri dizininizle birlikte depolayın: NLSVERSIONINFOEX.dwNLSVersion ve NLSVERSIONINFOEX.dwDefinedVersion – Bu iki özellik birlikte kullandığınız sıralama tablosunun sürümünü belirtir.
    NLSVERSIONINFOEX.dwEffectiveId - Bu, sıralamanızın etkili yerel ayarını belirtir. Özel bir yerel ayar, dahili bir yerel ayarın sıralamasına işaret eder.

  • Dizini kullanırken, verilerinizin sürümünü bulmak için GetNlsVersionEx() kullanın.

  • Üç özelliğin herhangi biri değiştiyse, kullandığınız sıralama verileri farklı sonuçlar döndürebilir ve sahip olduğunuz dizin oluşturma işlemleri kayıtları bulamayabilir.

  • Verilerinizin geçersiz Unicode kod noktaları içermediğini biliyorsanız (yani, isNLSDefinedString() çağrısından tüm dizeleriniz TRUE döndürdüyse), yalnızca dwNLSVersion ve dwDefinedVersion alt bayt değeri değiştiğinde (yukarıda açıklanan ikincil sürümler) bunları aynı şekilde düşünebilirsiniz.