NLS の並べ替えの変更

影響を受けるプラットフォーム

クライアント - Windows XP、Windows Vista、Windows 7
サーバー - Windows Server 2003、Windows Server 2008、Windows Server 2008 R2

機能への影響

重大度 - 高
頻度 - 低 (影響を受けたアプリはほとんどありませんが、影響を受けた場合は常に壊れています)

Description

各国語サポート (NLS) 関数は、アプリケーションが世界中のユーザーのさまざまな言語およびロケール固有のニーズをサポートするのに役立ちます。 新しい Windows バージョンには、ほとんどの場合、NLS の変更が含まれます。 この変更は、照合順序と並べ替えに影響するため、永続的なインデックスを持つアプリケーションにも影響します。

照合順序テーブルには、そのバージョン (リビジョン) を識別する 2 つの番号 (定義されたバージョンと NLS バージョン) があります。 どちらのバージョンも DWORD 値であり、メジャー バージョンとマイナー バージョンで構成されます。 値の最初のバイトは予約済みで、次の 2 バイトはメジャー バージョンを表し、最後のバイトはマイナー バージョンを表します。 16 進数では、パターンは 0xRRMMMMmm で、R は予約済み、M は major、m は minor です。 たとえば、マイナー バージョンが 4 のメジャー バージョン 3 は、0x304として表されます。

メジャー バージョンの場合、1 つ以上のコード ポイントが変更され、比較を有効にするためにアプリケーションですべてのデータのインデックスを再作成する必要があります。 マイナー バージョンの場合、何も移動しませんが、コード ポイントが追加されます。 この種類のバージョンでは、アプリケーションは、以前に並べ替え不可能な値を使用して文字列のインデックスを再作成するだけで済みます。 要約すると、ロケール固有の例外テーブルと既定のテーブルのデータ変更に関するバージョン番号の意味を次に示します。

NLSVersion Major – 'exception'、またはロケール固有のテーブルのコード ポイントが変更されました
NLSVersion Minor – 'exception'、またはロケール固有のテーブルに新しいコード ポイントを追加しました
DefinedVersion Major – 既定のテーブルのコード ポイントが変更されました
DefinedVersion Minor – 既定のテーブルに新しいコード ポイントを追加しました

リリースされたバージョンのバージョン番号の並べ替え:

オペレーティング システム リリース バージョン (0xRRMMMMmm)
Windows XP RTM/SP1/SP2/SP3/... N/A - GetNLSVersion() API なし
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

 

症状

NLS バージョンをチェックせず、バージョン変更時にインデックスを再作成する永続インデックスを持つアプリケーション (データベースなど) は、正しく並べ替えできないか、要求された結果を提供できない可能性があります。

ユーザー インターフェイスの場合、リスト (アルファベット、数字、英数字、記号など) が正しく並べ替えされないことがあります。

解決策

アプリケーションは 、GetNLSVersionEx (Windows Vista 以降) または GetNLSVersion (Windows Vista より前) を呼び出して、照合順序テーブルの定義されたバージョンと NLS バージョンの両方を取得できます。

  • GetNLSVersionEx:

名前で指定されたロケールの指定された NLS 機能の現在のバージョンに関する情報を取得します
この関数を使用すると、Active Directory などのアプリケーションで、NLS の変更が特定のインデックス テーブルに使用されるロケールに影響するかどうかを判断できます。 そうでない場合は、テーブルのインデックスを再作成する必要はありません。 詳細については、「ロケールと言語情報の処理」を参照してください。
この関数は、カスタム ロケールをサポートします。 lpLocaleName で補足ロケールが指定されている場合、取得されるデータは、その補足ロケールに関連付けられている照合順序の正しいデータになります。

メモ: Windows Vista より前のバージョンの Windows では 、GetNLSVersionEx はサポートされていません。

  • GetNLSVersion (Windows Vista より前のバージョンの Windows で実行されているアプリケーションに使用):

識別子で指定されたロケールの指定された NLS 機能の現在のバージョンに関する情報を取得します
この関数を使用すると、Active Directory などのアプリケーションで、NLS の変更が特定のインデックス テーブルに使用されるロケール識別子に影響するかどうかを判断できます。 そうでない場合は、テーブルのインデックスを再作成する必要はありません。 詳細については、「ロケールと言語情報の処理」を参照してください。
メモ: この関数は、識別子で指定されたロケールに関する情報のみを取得します。 GetNLSVersionEx 関数は、追加のロケール、機能、RFC 4646 名をサポートしています。 ただし、Windows Vista より前のバージョンの Windows では 、GetNLSVersionEx はサポートされていません。
Windows Vista 以降でのみ実行するアプリケーションでは、この関数を優先して GetNLSVersionEx を使用する必要があります。 GetNLSVersionEx は、補助ロケールに対して適切なサポートを提供します。

互換性テスト

照合順序のバージョンが変更されたかどうかを確認する手順 (つまり、インデックスを再作成する必要があります)。

  • データの元のインデックス作成を実行するときに、GetNLSVersionEx() を使用してNLSVERSIONINFOEX 構造体を取得します。

  • バージョンを識別するために、インデックスに次のプロパティを格納します。 NLSVERSIONINFOEX.dwNLSVersionNLSVERSIONINFOEX.dwDefinedVersion – これら 2 つのプロパティは、使用している並べ替えテーブルのバージョンを指定します。
    NLSVERSIONINFOEX.dwEffectiveId - 並べ替えの有効なロケールを指定します。 カスタム ロケールは、インボックス ロケールの並べ替えを指します。

  • インデックスを使用する場合は 、GetNlsVersionEx() を使用してデータのバージョンを検出します。

  • 3 つのプロパティのいずれかが変更された場合、使用している並べ替えデータによって異なる結果が返され、インデックス作成でレコードが見つからない可能性があります。

  • データに無効な Unicode コード ポイントが含まれていないことがわかっている場合 (つまり、IsNLSDefinedString()の呼び出しからすべての文字列が TRUE を返した場合)、dwNLSVersiondwDefinedVersion の下位バイトのみが変更された場合 (上記のマイナー バージョン) は同じと見なすことができます。