EUDC および PUA 文字の書き込み、マッピング、並べ替え

アプリケーションは、 TextOutExtTextOut などの出力関数を使用して、他の文字を書き込むのと同じように、エンド ユーザー定義文字 (EUDC) とプライベート使用領域 (PUA) 文字を画面またはプリンターに書き込みます。 これらの関数は、EUDC が有効になっている場合、EUDC または PUA 文字フォントから文字情報を自動的に取得します。 詳細については、「 End-User_Defined」および「Private Use Area Characters」を参照してください。

EUDC または PUA 文字を記述する場合、テキスト出力関数の操作は、現在選択されているフォントによって異なります。 選択したフォントが統合 EUDC または PUA 文字フォントの場合、関数はそのフォントから文字情報を取得します。 選択したフォントが、個別の EUDC フォントが関連付けられている 2 バイト文字セット (DBCS) TrueType フォントである場合、この関数は指定された EUDC フォントから情報を取得します。 同様に、選択したフォントが個別の PUA 文字フォントが関連付けられている Unicode TrueType フォントの場合、この関数は PUA 文字フォントから情報を取得します。 選択したフォントに EUDC または PUA 文字フォントが関連付けられていない場合、この関数はシステムの既定の EUDC フォントから情報を取得します。 文字がシステムの既定の EUDC フォントに含まれていないか、システムの既定の EUDC フォントがない場合、関数は選択したフォントで定義された既定の文字を書き込みます。

アプリケーションでは、 MultiByteToWideChar 関数と WideCharToMultiByte 関数を使用して、Unicode との間で EUDC をマップできます。 MultiByteToWideChar 関数は、ほとんどの EUDC を Unicode PUA の文字にマップします。 ただし、特定の国または地域の標準をサポートするために、一部の EUDC を PUA 以外の Unicode コード ポイントにマップできます。 WideCharToMultiByte 関数は、そのようなマッピングが存在する場合、およびコード ポイントに Unicode で有効な非 PUA マッピングがない場合に、PUA 内の文字を対応する EUDC にマップします。 すべてのコード ページに EUDC 範囲があるわけではありません。 WideCharToMultiByte の呼び出しで指定されたコード ページには、EUDC 範囲へのマッピングを実行するための EUDC コード範囲が含まれている必要があります。 コード ページに EUDC コード範囲が含まれていない場合、この関数は Unicode PUA 内の任意の文字の既定の文字を取得します。

MultiByteToWideCharWideCharToMultiByte では、ラウンドトリップ マッピングは保証されません。 つまり、EUDC を含む特定のマルチバイト文字列から開始し、 MultiByteToWideChar を使用して文字列を Unicode にマップし、 WideCharToMultiByte を使用して元の DBCS にマップし直し、元の文字列と同じ結果になる可能性があります。 UNICODE への EUDC のマッピングに依存するアプリケーションでは、必要なすべての文字が適切なコード ページ EUDC 領域と Unicode PUA の間をラウンド トリップできることを確認する必要があります。

アプリケーションは、あるコード ページから別のコード ページに EUDC をマップしようとしないでください。 アプリケーションが 1 つのコード ページから EUDC で始まり、 MultiByteToWideChar を使用して Unicode にマップし、 WideCharToMultiByte を使用して別の DBCS にマップする場合、結果に関する保証はありません。 元の文字は、変換先コード ページの別の EUDC にマップされるか、未定義の文字としてマップされる可能性があります。 同様に、UNICODE 文字列を EUDC 範囲を持つコード ページにマッピングすると、意図しない結果になる可能性があります。 Unicode 文字列に PUA コード ポイントが含まれている場合、コード ポイントが同じ文字を表さない EUDC にマップされる可能性があります。

アプリケーションでは、ANSI バージョンの CompareString 関数を使用して、EUDC を含む DBCS 文字列を比較できます。 関数は、文字値を比較する前に、文字を Unicode に効果的にマップします。 アプリケーションでは、ANSI バージョンの LCMapString 関数とLCMAP_SORTKEY値を使用して、文字列の並べ替えキーを作成できます。 この関数は、最初に文字を Unicode に効果的にマップします。 PUA 内のすべての文字は、他のすべての Unicode 文字の後に並べ替えられます。 領域内では、文字は数値順に並べ替えられます。 アプリケーションが GetStringTypeA 関数を使用して EUDC の CTYPE 情報を取得しようとすると、関数は文字ごとに NULL を 取得します。

Unicode と文字セットの使用