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

フォント管理

テキストを X Windows System のクライアントに受け渡す場合、少なくとも 2 つの状況が国際化対応に関係します。

「ローカライズされたテキストの抽出」に、ローカライズされたテキストを獲得する方法が説明されています。

フォントを文字セットに一致させる

1 つのフォントには、ロケールの文字を描画するのに使用されるグリフのセットが含まれます。しかし、指定したロケールのために、次のような作業を実行する場合があります。

XLFD 名の最後の 2 つのフィールドは、フォントにどのグリフが含まれているか、セットから特定のグリフを獲得するのにどの値が使用されるかを識別します。これらの最後の 2 つのフィールドは、フォントに含まれるグリフのエンコーディングを識別します。

-adobe-courier-medium-r-normal--24-240-75-75-m-150-iso8859-1

この XLFD 名の最後の 2 つのフィールドは、iso8859 1 です。これらのフィールドは、ISO8859-1 標準グリフがフォントに含まれるよう指定しています。さらに、ISO8859-1 標準の文字コード値を使用して、各文字に対応するグリフを索引付けするようにも指定しています。

アプリケーションがデータを受け渡すために使用するフォント charset は、選択するロケールによって決まります。フォント charset 情報はロケールの選択に基づくので、フォント指定はアプリケーションによってハードコードしてはいけません。その代わりに、ロケール固有の app-defaults ファイルにフォント指定を格納して、ローカライズされたバージョンの app-defaults ファイルを作成できます。

さらに、フォントはフォント・セットとして指定されます。フォント・セットは、複数のフォントを指定するのに XLFD が使用する Xlib の概念です。XLFD のフォント charset フィールドは、フォント・セットを作成して、ユーザが指定したロケールに基づいてこれらのフィールドを埋める Xlib コードで指定されます。

日本語、中国語、韓国語などの多くの言語で、単一のエンコーディングをサポートするのに複数の charset が組み合わされています。このような場合、文字を描画するためには必ず複数のフォントをオープンしなければなりません。さらに、データは各フォントに対応するセグメントへと解析されなければならず、場合によりそれらのセグメントの文字値をグリフ索引に変換しなければなりません。XFontset は、指定ロケールの文字データを描画するのに必要なすべてのフォントの集合ですが、このような問題も処理します。さらに、描画のためのセットとメトリック・ルーチンが提供されます。それらは内部で文字列を一貫した文字セットのセグメントに分け、値をグリフ索引に変換します。これらのルーチンはアプリケーション開発者の負担を軽減します。アプリケーション開発者は、ユーザのフォント・セットと新しい X11R5 描画とメトリック・アプリケーション・プログラム・インタフェース (API) だけを必要とします。

フォント・オブジェクト

この節では次のフォント・オブジェクトを説明します。

フォント・セット

一般的に、Xlib を使用してローカライズされたテキストを描画するすべての国際化対応プログラムは、ロケール依存フォントを指定するために XFontSet() を使用しなければなりません。1 つのフォント・セット内の特定のフォントは、charset フィールドには指定せずに、XLFD 命名規則を使って指定されます。XFontSet のリソース名は *fontSet です。フォント・リソースのリストは、「ローカライズされたリソース」を参照してください。

(XmString 関数やウィジェットを使用するのに対して) Xlib を直接使用してテキストを描画するアプリケーションは、Xt が提供する文字列からフォント・セットへのコンバータを利用できます。たとえば、次のコード・フラグメントは Xt を使用する場合と使用しない場合のフォント・セットの獲得方法を示します。

/* pardon the double negative... means "If using Xt..." */  
#ifndef NO_XT  
typedef struct {
        XFontSet fontset;
        char     *foo;  
} ApplicationData,  *ApplicationDataPtr;
static XtResource my_resources[] = {
    { XtNfontSet, XtCFontSet, XtRFontSet, sizeof (XFontSet),
    XtOffset (ApplicationDataPtr, fontset), XtRString,
    "*-18-*"}}  
#endif /* NO_XT */  
...  
#ifdef NO_XT  
fontset = XCreateFontSet (dpy, "*-18-*", &missing_charsets,
    &num_missing_charsets. &default_string);
if (num_missing_charsets > 0) {
    (void) fprintf(stderr, "&s: missing charsets.¥n",
                   program_name);
    XFreeStringList(missing_charsets);  
}  
#else 
XtGetApplicationResources(toplevel, &data, my_resources,
                          XtNumber(my_resources), NULL, 0);  
fontset = data.fontset;  
#endif /* NO_XT */

フォント

国際化対応プログラムは、特定の charset と特定の文字セットのために使用する場合以外は、フォント (つまり XFontStruct) を直接使用することは避けてください。ロケールが必要とする特定の charset を接続しているサーバがサポートしていない場合、XFontStruct の使用は制限されます。XFontStruct のリソース名は *font です。

フォント・リスト

ローカライズされたテキストを描画するためにウィジェットや XmString を使用しているすべてのプログラムは、フォントを指定するために XmFontList 名を指定する必要があります。フォント・リストは 1 つ以上のフォント・セットまたはフォントのリストか、あるいはフォント・セットとフォント両方のリストです。フォント・リストは、ウィジェットがテキストを描画するために使用すべきフォントとフォント・セットのリストを指定するために使用されます。より複雑なアプリケーションの場合、フォント・リストは複数のフォント・セットを指定し、各フォント・セットには名前がタグ付けされます (たとえば Bold、Large、Small など) 。このタグは XmString セグメントのタグと関連付けられます。タグは、フォント・リスト内の特定のフォントやフォント・セットを識別するのに使用されます。

フォント・セットおよびフォント・リストの形式

表 2-1 にフォント・セットとフォント・リストの形式を示します。

表 2-1 フォント・セットおよびフォント・リストの形式

リソース型 

XLFD セパレータ 

終止符 

FontEntry セパレータ 

*fontSet: (Xlib)

カンマ 

なし 

なし 

*fontList : (Motif)

セミコロン 

コロン 

カンマ 

次に、フォント・リソース指定の例をいくつか挙げます。

app_foo*fontList: -adobe-courier-medium-r-normal--24-240-75-75-m-150-*:

上記の fontList は、ユーザのロケールに適切なものとして、1 つ以上の 24 ポイント Adobe Courier フォントから成るフォント・セットを指定しています。

app_foo*fontList: -adobe-courier-medium-r-normal--18-*; *-gothic-*-18-*:

この fontList は、ユーザのデータの一部の文字には 18 ポイント Courier フォントから成るフォント・セットを指定し、その他の文字には 18 ポイント Gothic フォントを指定しています。

Motif ベースのアプリケーションは、フォント・リストに入っているフォント・セットに直接アクセスする必要が起こる場合があります。たとえば、DrawingArea ウィジェットを使用するアプリケーションは、描画したイメージの 1 つにラベルを付けたいことがあります。次のコード例は、フォント・リストからのフォント・セットの抽出方法を示しています。この例では、タグ XmFONTLIST_DEFAULT_TAG でフォント・セットを探します。XmFONTLIST_DEFAULT_TAG が「ロケールの codeset」を指すためです。アプリケーションでは、ローカライズされたデータを含むすべての文字列に XmFONTLIST_DEFAULT_TAG を使用してください。

XFontSet FontList2FontSet( XmFontList fontlist)  
{  
XmFontContext context;
XmFontListEntry next_entry;  
XmFontType type_return = XmFONT_IS_FONT;  
char* font_tag;  
XFontSet fontset;  
XFontSet first_fontset;  
Boolean have_font_set = False;   

if ( !XmFontListInitFontContext(&context, fontlist)) {
     XtWarning("fl2fs: can't create fontlist context...");
     exit 0;  
}   

while ((next_entry = XmFontListNextEntry(context) != NULL) {

  fontset = (XFontSet) XmFontListEntryGetFont(next_entry,
              &type_return);
  if (type_return == XmFONT_IS_FONTSET ) {

      font_tag = XmFontListEntryGetTag(next_entry);

      if (!strcmp(XmFONTLIST_DEFAULT_TAG, font_tag) {
          return fontset;
      }
      /* Remember the 1st fontset, just in case... */
      if (!have_font_set) {
          first_fontset = fontset;
          have_font_set = True;
      }
   }
}  
if (have_font_set)
      return first_fontset;  
return (XFontSet)NULL; 
}

フォント関数

次の Xlib のフォント管理 API 関数を使用できます。

次の Motif の FontList API 関数を使用できます。

フォント charset

基本的な互換性を高めるために、フォントは標準 X コンソーシアムの font charset に沿って構成されています。

言語グループごとのデフォルト・フォント・セット

開発者の言語に関連付けられたフォント・セットのベース・フォント名を選択することは、通常は簡単です。開発者はその言語および必要なフォントのセットに慣れているからです。

しかし、さまざまなロケールのためのフォント・セットのベース・フォント名を選択する場合、XLFD フォント仕様は 15 ものフィールドから成るため、この作業は難しくなります。ローカライズする場合、フォント・セット選択のためには次のフィールドが重要です。

これによりフィールド数が減りますが、各フィールドの取り得る値はロケールごとに変化します。実際のポイント・サイズ (POINT_SIZE) は、プラットフォームごとに変化します。

このマニュアル全体を通して、ローカライズされたフォントを指定する際には次の規則が使用されます。

-dt-%F-%W-%S-normal-%A-*-*-*-%SP-*

以下に、リソース (app-defaults) ファイルにフォント・セットを指定する際に、デスクトップ内で使用する必須フィールドごとの推奨する最小セットを示します。

ラテン ISO8859-1 フォント

FOUNDRY

dt

FAMILY_NAME

interface user

interface system

application

WEIGHT_NAME

medium または bold

SLANT

r または i

ADD_STYLE

sans serif または serif

SPACING

p または m

その他の ISO8859 フォント

ISO8859-1 で定義するのと同じ値をお勧めします。

JIS 日本語フォント

FOUNDRY

dt

FAMILY_NAME

Gothic または Mincho

WEIGHT_NAME

medium または bold

SLANT

r

ADD_STYLE

*

SPACING

m

KSC 韓国語フォント

FOUNDRY

dt

FAMILY_NAME

Totum または Pathang

WEIGHT_NAME

medium または bold

SLANT

r

ADD_STYLE

*

SPACING

m


注 -

FAMILY_NAME の値は、2 つの共通フォント・ファミリの公的なローマ字表記法のうち使用しているものによって変化します。背景として、Totum は通常、ゴシック、 Kodig、 または Dotum として出荷されるフォントに対応します。Pathang は通常 Myungo か Myeongjo として出荷されるフォントに対応します。


CNS 繁体字中国語フォント

FOUNDRY

dt

FAMILY_NAME

Sung と Kai

WEIGHT_NAME

medium または bold

SLANT

r

ADD_STYLE

*

SPACING

m

GB 簡体字中国語フォント

FOUNDRY

dt

FAMILY_NAME

Song と Kai

WEIGHT_NAME

medium または bold

SLANT

r

ADD_STYLE

*

SPACING

m