サロゲート文字と補助文字

Windows アプリケーションでは通常、 Unicode 文字データを表すために UTF-16 が使用されます。 16 ビットを使用すると、65,536 文字の一意の文字を直接表現できますが、この基本的な多言語プレーン (BMP) では、人間の言語で使用されるすべてのシンボルをカバーするには、ほぼ十分ではありません。 Unicode バージョン 4.1 には、97,000 文字を超える文字が含まれています。中国語のみで 70,000 文字を超えます。

Unicode 標準では、BMP と同じサイズの 16 個の追加の "プレーン" 文字が確立されています。 当然ながら、BMP を超えるほとんどのコード ポイントにはまだ文字が割り当てられませんが、プレーンの定義により、Unicode では、コード ポイント範囲 U+0000 から U+10FFFF までの1,114,112 文字 (つまり、2 16 * 17 文字) を定義できます。 UTF-16 がこの大きな文字セットを表す場合、Unicode 標準では "補助文字" が定義されます。

補助文字について

補助文字は BMP を超える文字であり、"サロゲート" は UTF-16 コード値です。 UTF-16 の場合、1 つの補助文字を表すには"サロゲート ペア" が必要です。 最初の (高) サロゲートは、U+D800 から U+DBFF までの範囲の 16 ビット コード値です。 2 番目の (低) サロゲートは、U+DC00 から U+DFFF までの範囲の 16 ビット コード値です。 サロゲート メカニズムを使用すると、UTF-16 は 1,114,112 個の Unicode 文字をすべてサポートできます。 補助文字、サロゲート、サロゲート ペアの詳細については、「 Unicode 標準」を参照してください。

Note

Windows 2000 では、基本的な入力、出力、および補助文字の簡単な並べ替えのサポートが導入されています。 ただし、すべてのシステム コンポーネントが補助文字と互換性があるわけではありません。

 

オペレーティング システムでは、次の方法で補助文字がサポートされています。

  • OpenType フォント cmap テーブルの書式 12 は、4 バイト文字コードを直接サポートします。 詳細については、 OpenType フォントの仕様に関するページを参照してください。
  • Windows では、サロゲート対応 の入力メソッド エディター (IME) がサポートされています。
  • Windows GDI API では、サロゲートを正しく表示できるように、フォントで 12 個の cmap テーブルの形式がサポートされています。
  • Uniscribe API では、補助文字がサポートされています。
  • 編集リッチ エディットなどの Windows コントロールでは、補助文字がサポートされています。
  • HTML エンジンは、表示、編集 (Outlook Express 経由)、フォーム送信用の補助文字を含む HTML ページをサポートしています。
  • オペレーティング システムの並べ替えテーブルでは、補助文字がサポートされています。

補助文字を使用したソフトウェア開発の一般的なガイドライン

UTF-16 は補助文字をサロゲート ペアとして処理します。 オペレーティング システムは、非 スペーシング マークを処理する方法と同様にサロゲート ペアを処理します。 表示時に、サロゲート ペアは Unicode 標準で規定されているように、Uniscribe を使用して 1 つのグリフとして表示されます。

Windows Vista では、UTF-16 文字列でサロゲートとサロゲートのペアを識別するのに役立つ 3 つの新しいマクロが導入されています。 これらは 、IS_HIGH_SURROGATEIS_LOW_SURROGATEおよびIS_SURROGATE_PAIRです。

Unicode をサポートし、システム コントロールと標準 API 関数 ( ExtTextOut や DrawText など) を使用する場合、アプリケーションは補助文字を自動的にサポート します。 したがって、アプリケーションで標準システム コントロールを使用する場合、または一般的な ExtTextOut 型の呼び出しを使用して表示する場合、補助文字は特別なコーディングなしで機能する必要があります。

グリフの位置をカスタマイズした方法で処理することによって独自の編集サポートを実装するアプリケーションでは、すべてのテキスト処理に Uniscribe を使用できます。 Uniscribe には、テキスト表示、ヒット テスト、カーソルの移動など、複雑なスクリプト処理を処理するための個別の関数があります。 これらの高度な機能を取得するには、アプリケーションで Uniscribe 関数を呼び出す必要があります。 Uniscribe 関数を使用するアプリケーションは完全に多言語ですが、これによりパフォーマンスが低下します。 したがって、一部のアプリケーションでは、補助文字の独自の処理を行う必要があります。

補助文字を表すサロゲート メカニズムは明確に定義されているため、アプリケーションには UTF-16 サロゲート テキスト処理を処理するコードを含めることができます。 アプリケーションで、低い予約サロゲート範囲 (低サロゲート) または上位予約サロゲート範囲 (上位サロゲート) のいずれかから分離された UTF-16 値が検出された場合、値はサロゲート ペアの半分である必要があります。 したがって、アプリケーションは、単純な範囲チェックを行うことでサロゲート ペアを検出できます。 下限または上限範囲で UTF-16 値が検出された場合、残りの文字を取得するには、1 つの 16 ビット幅を後方または前方に追跡する必要があります。 アプリケーションを作成するときは、 CharNextCharPrev がサロゲート ペアではなく 16 ビット コード ポイントで移動することを覚えておいてください。

Note

スタンドアロン サロゲート コード ポイントには、隣接する低サロゲートがない上位サロゲート、またはその逆があります。 これらのコード ポイントは無効であり、サポートされていません。 それらの動作は未定義です。

 

フォントまたは IME プロバイダーを開発している場合は、Windows XP 以前のオペレーティング システムでは、既定で補助文字のサポートが無効になっていることに注意してください。 Windows XP 以降では、既定で補助文字が有効になります。 補助文字を必要とするフォントと IME パッケージを指定する場合は、アプリケーションで次のレジストリ値を設定する必要があります。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\LanguagePack]
SURROGATE=(REG_DWORD)0x00000002

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\International\Scripts\42]
IEFixedFontName=[Surrogate Font Face Name]
IEPropFontName=[Surrogate Font Face Name]

文字セット