共通デスクトップ環境 プログラマーズ・ガイド (国際化対応編)

フォント、フォント・セット、フォント・リスト

すべての X クライアントはテキストを描画するのにフォントを使用します。テキスト描画に使用する基本的なオブジェクトは XFontStruct() です。XFontStruct() は、描画するイメージを含むフォントを識別します。

すでにデスクトップは、Xlib で定義される XFontStruct() データ構造体としてフォントをサポートしています。しかし、フォント内の文字のエンコーディングは国際化対応アプリケーションに認識されていなければなりません。この情報を知るために、プログラムはサーバのすべてのフォントが X 論理フォント (XLFD) 名で識別できることを期待します。XLFD 名により、ユーザは基本特性と charset (フォント・グリフのエンコーディング) の両方を記述できます。charset という用語は、フォント内のグリフのエンコーディングを表すのに使用されます。一方、コード・セットという用語はロケール内の文字のエンコーディングを意味します。指定されたフォントの charset は、XLFD 名の CharSetRegistry フィールドと CharSetEncoding フィールドで決定されます。テキストと記号は、フォント内のコードによって定義されたとおりに描画されます。

フォント・セット (例: Xlib によって定義されるデータ構造体 XFontSet()) は、指定のロケール用に定義されたすべての文字を描画可能にする 1 つ以上のフォントの集合です。ロケールによってはグリフの索引とコード・セットのエンコーディングが一致しない場合がありますが、国際化されたアプリケーションは、このような場合でもテキストを描画できなければなりません。さらに、エンコーディングがロケールのコード・セットと異なるフォントを 1 つ以上使用しているロケールのすべての文字を描画するには、複数のフォントが必要になることがあります。コード・セットと charset は両方ともロケールごとに異なるため、フォント・セットという概念を XFontSet() として実現しています。

フォントが XLFD 名によって識別される一方、フォント・セットは XLFD 名のリストによって識別されます。基本特性のみが重要である点を除き、リストは 1 つ以上の XLFD 名から成ります。必要とされるフォントのエンコーディングはロケールから決定されます。XLFD ベース名リストに指定されている charset はすべて無視されるため、ユーザが考慮する必要があるのはポイント・サイズ、スタイル、ウェートなどのベース特性を指定することだけです。フォント・セットはロケールによって変わり、ロケールのコード・セットでエンコードされたテキストを描画するのに使用されます。国際化対応アプリケーションは、テキスト・データを描画するのにフォント構造体の代わりにフォント・セットを使用すべきです。

フォント・リストは、1 つ以上のフォント・リスト・エントリの集合である libXm Toolkit オブジェクトです。フォント・セットはフォント・リストで指定できます。各フォント・リスト・エントリは、フォントかフォント・セットのいずれかを指定し、名前がタグ付けされます。フォント・リスト・エントリにタグがない場合は、デフォルト・タグ (XmFONTLIST_DEFAULT_TAG) が使用されます。フォント・リストは、libXm Toolkit ライブラリにある XmString() 関数と共に使用できます。フォント・リストにより、1 つ以上のセグメント (各セグメントはタグで識別される) から成るコンパウンド・ストリングの描画が可能になります。これにより、異なる基本特性を持つ文字列の描画が可能になります (たとえば、1 回のオペレーションでボールドとイタリックの文字列を描画できます)。libXm ライブラリの XmText() など一部の XmString() ベースではないウィジェットは、フォント・リストでフォント・リスト・エントリを 1 つしか使用しません。Motif フォント・リストは、フォント・リスト内のフォント・セットを識別するために接尾辞 : (コロン) を最後につけます。

通常、ユーザは (フォントかフォント・セットのいずれかが含まれている) フォント・リストか、またはフォント・セットを指定するよう要求されます。国際化対応環境では、ユーザはコード・セットに依存しないフォントを指定できなければなりません。というのは、その指定は、フォントの文字セット (charset) よりも、異なるコード・セットを持つさまざまなロケールで使用されるからです。したがって、すべてのフォント・リストにはフォント・セットを指定するようにしてください。

フォント指定

フォント指定は、X 論理フォント (XLFD) 名か、XLFD 名の別名のいずれかになります。たとえば、次の例はどちらも 14 ポイント・フォントの有効なフォント指定です。

-dt-application-medium-r-normal-serif-*-*-*-*-p-*-iso8859-1

または

-*-r-*-14-*iso8859-1

フォント・セット指定

フォント・セット指定は、名前 (XLFD 名かその別名) のリストであり、ベース名リストと呼ばれることもあります。すべての名前はカンマで区切られ、カンマの前後にある空白スペースはすべて無視されます。XLFD 名を短縮するためにパターン照合 (ワイルドカード) 文字を指定できます。

フォント・セット指定は、実行中のロケールによって決定されることに注意してください。たとえば、日本語ロケール ja_JP は、日本語のすべての文字を表示するのに必要な 3 つのフォント (文字セット) を定義します。次の例では必要なゴシック・フォントのセットが識別されます。

上記の 2 例は、ベース名リストに一致するフォントが存在する限り日本語ロケールで使用できます。

フォント・リスト指定

フォント・リスト指定は 1 つ以上のエントリから成り、各エントリはフォント指定かフォント・セット指定のいずれかになります。

各エントリには、コンパウンド・ストリングを描画するときに使用される名前がタグ付けされます。タグはアプリケーションで定義され、通常はフォントの種類が予想できるような名前です (bold()italic()bigbold() など)。ヌルのタグはデフォルト・エントリを表すのに使用され、XmString() 関数で使用される XmFONTLIST_DEFAULT_TAG 識別子に関連付けられます。

フォント・タグは、= (等号記号) が接頭部に付くときに識別されます。たとえば、=bigbold() はサーバで定義された最初のフォントに一致します。= が指定されていてもその後に名前がない場合は、その指定は「デフォルト・フォント・リスト・エントリ」と見なされます。

フォント・セット・タグは、: (コロン) が接頭部に付くときに識別されます。たとえば、:bigbold() はロケールの条件を満たす、サーバの最初のフォント・セットに一致します。: が指定されていても名前が指定されていない場合は、その指定はデフォルト・フォント・リスト・エントリと見なされます。フォント・リスト・エントリ指定内では、ベース名リストは , (カンマ) ではなく ; (セミコロン) で区切られます。

フォント・リスト指定の例

ラテン 1 ロケール用には、次のように入力します。

   -*-r-*-14-*: ,      # default font list entry
   -*-b-*-18-*:bigbold # Large Bold fonts

ベース・フォント名リスト指定

ベース・フォント名リストは、ロケールによって定義されたフォント・セットに関連付けられたベース・フォント名のリストです。ベース・フォント名はカンマで区切られたリストであり、ポータブル文字セットからの文字だと想定されます。そうでない場合の結果は不定です。セパレータのカンマに隣接する空白スペースは無視されます。

XLFD フォント名の使用により、国際化対応のアプリケーションが、単一のロケールに依存しないベース・フォント名からさまざまなロケールに必要なフォントを得ることができます。単一のベース・フォント名は、該当ロケールに必要なさまざまな charset でメンバがエンコードされたフォントのファミリを指します。

XLFD ベース・フォント名は、ロケールに必要なフォントの charset を明示的に指定できます。このことにより、ユーザはロケールに必要な charset で使用するフォントを厳密に指定することができるので、フォント選択を完全に制御できます。

ベース・フォント名が XLFD 名でない場合は、フォントのフォント属性から XLFD 名を獲得しようとします。

次のアルゴリズムは、フォント・セットでテキストを表示するのに使うフォントを選択するために使用されます。

ロケールに必要な各 charset ごとに、ベース・フォント名リストはサーバに存在するフォント・セットを指定する以下の場合の最初にあてはまるものが検索されます。

たとえば、ロケールには次の charset が必要だと想定します。

次の例のように、charset を明示的に指定したベース・フォント名リストを提供し、特定のフォントが存在する場合には確実に使用するようにできます。

"-dt-mincho-Medium-R-Normal-*-*-*-*-*-M-*-JISX0208.1983-0,\
-dt-mincho-Medium-R-Normal-*-*-*-*-*-M-*-JISX0201.jisx0201\.1976-1,\
-dt-song-Medium-R-Normal-*-*-*-*-*-M-*-GB2312-1980.0,\
-*-default-Bold-R-Normal-*-*-*-*-M-*-ISO8859-1"

次の例のように、charset を省いたベース・フォント名リストを提供すると、必要な各コード・セット用のフォントを選択できます。

"-dt-Fixed-Medium-R-Normal-*-*-*-*-*-M-*,\
-dt-Fixed-Medium-R-Normal-*-*-*-*-*-M-*,\
-dt-Fixed-Medium-R-Normal-*-*-*-*-*-M-*,\
-*-Courier-Bold-R-Normal-*-*-*-*-M-*"

代わりの方法として、次の例のように単一ベース・フォント名を提供すると、ある最小の XLFD 属性要求事項を満たす使用可能なすべてのフォントから選択できます。

"-*-*-*-R-Normal--*-*-*-*-*-M-*"