Java ランタイムへのフォントの追加

このドキュメントでは「Java ランタイム」JDK 1.1 に、アジア言語および他の言語を追加する方法を説明します。もう少し特定すれば、このドキュメントでは、「Java ランタイム」にこれらのフォントを追加するための JDK 1.1 の特別な機能を取り上げます。この機能は、将来 JDK がバージョンアップするときに変更になる可能性があります。

今回このドキュメントでは、日本語、韓国語、中国語および従来の漢字フォントのインストールの方法を説明します。

「Java ランタイム」の中核部分に Latin-1 フォントのサポートしかない場合、この「ランタイム」は 1 つの font.properties ファイルしか必要としません。他のすべての font.properties ファイルはオプションの I18n パッケージに入っています。

Win32 プラットフォーム用の JDK 1.1 バージョンは、 TrueType フォントをサポートします。Solaris 用の JDK 1.1 は、F3、Type1 および TrueType などの X11 サーバが扱えるアウトラインフォントをサポートします。

font.properties ファイルの使用

フォントを「Java ランタイム」に追加するためには、font.properties ファイルを操作する必要があります。font.properties ファイルはプラットフォーム固有のものです。これは特定のプラットフォームが Java 仮想フォント用に使用するフォントを指示します。フォントは型またはクラスによってグループ化されます。 現在「Java ランタイム」はフォントの次のクラスをサポートしています:

いくつかの font.properties ファイルは、 JDK 1.1 とバンドルされて出荷されています。これらのファイルは、Java がインストールされているディレクトリの下の ../lib ディレクトリにあります。これらのファイルには標準フォント環境に関する情報が入っています。これからの説明では、このドキュメントの読者が英語環境で作業しているものと仮定します。英語環境では、次のように font.properties ファイルをファイル名に後置なしで使用します:

font.properties
しかし、使用環境が日本語、韓国語、中国語または従来の漢字の場合、その特定の環境に対応する font.properties ファイルを使用する必要があります。これらのファイルは、次のようにファイル名に国またはロケール後置を追加して識別します。
font.properties.<locale>
ただし、locale は次の内の 1 つです。
ja

ko

zh

zh_TW

...
関心のある特定のフォントの後置付きファイルを選択します。こうして、従来の漢字については font.properties.zh_TW ファイルをアクセスします。

Java ランタイムへのアジアフォントの追加

英語環境プラットフォーム上で日本語フォントなどのアジアフォントを使用するためには、 2 つのステップを踏む必要があります。

ステップ 1: フォントのインストール

最初に、日本語、韓国語、中国語または従来の漢字フォントを使用しているシステムにインストールする必要があります。Windows プラットフォームユーザについては、Microsoft はこれらのアジアフォントを、 NT4.0 インストレーション CD に添付して配布しています。あるいは、これらのフォントを Microsoft World Wide Web ホームページからダウンロードできます。Solaris ユーザは SunSoft に連絡を取り、Solaris 環境のアジアアウトラインフォントをお求めください。

ステップ 2: フォントのコピー

システムにフォントをインストールした後、関心のあるフォント説明を font.properties にコピーします。アジアフォントを 1 つ追加する最も簡単な方法は、font.properties.<locale> ファイルを新しい font.properties ファイルに名前変更することです。ロケールシンボルはユーザが関心を持つフォント名を表します。font.propertiesfont.properties.<locale> で置換するとき、編集は必要ありません。それは、font.properties.<locale>font.properties のスーパーセットだからです。異なるフォントプロパティファイルを指定するのは、次に示すロケールシンボルです:

フォントのロケールシンボル

フォント名font.properties シンボル
日本語ja
韓国語ko
中国語zh
従来の漢字zh_TW

これで韓国語フォントを使用するためには、font.properties.kofont.properties にコピーまたは名前変更します。

ランタイムでの複数フォントの使用

ランタイムで複数のアジアフォントを使用することができます。このためには、font.properties ファイルを編集する必要があります。この節では、複数のアジアフォントを使用するために必要なファイルの編集について説明します。font.properties ファイルはプラットフォームのフォントに関するある種の情報を定義します。この中には次のようなエイリアスがあります。

alias.timesroman=serif

alias.helvetica=sansserif
これにはフォントの説明も入っています。この説明は、Win32 および Solaris プラットフォームの間では異なります。例ではセリフフォントを使用して、必要に応じたフォントの指定と変換の方法を説明しています。しかし、同じエントリが他の型のフォントにも適用されます。一般的に、フォントプロパティファイルにはユーザが使用したいフォントを指定するエントリがあります。これらのエントリは次のようなフォーマットを持っています。
   <virtual font name>.<index number> = <platform font name>, attributes
virtual font name は、「Java ランタイム」が認識するフォントの名前です。platform font name は、プラットフォームの実際のフォント名です。例えば、Dialog および Serif は Java フォント名であり、Times および Helvetica は Win32 または Solaris プラットフォームのネイティブフォント名です。index number はゼロを最高の優先順位として、フォントグリフを照合するための検索順序を指定します。

Win32 プラットフォームでのフォントの指定

英語 Win32 プラットフォームには 3 つの使用可能な既定のセリフフォントがあります。そのフォントは次のとおりです。

さらに、font.properties ファイル内のこれらセリフフォントの説明は、次のとおりです:


serif.0=Times New Roman,ANSI_CHARSET

serif.1=WingDings,SYMBOL_CHARSET,NEED_CONVERTED

serif.2=Symbol,SYMBOL_CHARSET,NEED_CONVERTED

上記の 3 行はこのプラットフォーム上で使用可能な 3 つのセリフフォントの添字を示します。各行は 1 つのセリフフォントを示し、後ろにそのフォントの 3 つの引数が付きます。

serif.0 などの serif という語の後に表示されている数字(0、1、2)は、Unicode{tm}、または Java 文字列エンコーディング、codepoint で対応するフォントグリフを検索する順序を示します。こうして、serif.0 および serif.1 の両方が同じ Unicode codepoint に対応するグリフを持っている場合、serif.0 のグリフが使用されます。

最初の引数は、Win32 ネイティブフォントの書体名です。各行は特定のフォントを指名します。例えば、serif.0 の行はフォント Times New Roman を、serif.2 の行はフォント Symbol を指名しています。

第 2 の引数は *_CHARSET という形式を取ります。この例では、ANSI_CHARSET または SYMBOL_CHARSET のどちらかです。この引数は Win32 での対応するフォントの文字セットエントリを示します。(詳細については、Win32 API ドキュメントを参照してください。)

3 番目の引数は、もしあれば、 NEED_CONVERTED です。この引数は、対応するプラットフォームフォントを Unicode{tm} でアクセスできないことを示します。この引数が存在するとき、「Java ランタイム」は、フォントのグリフの使用を試みる前に、 Unicode{tm} 文字列をこのフォントの添字に変換する必要があります。この NEED_CONVERTED 引数を持つフォントは、対応するフォント文字セットエントリを持つ必要があります。このエントリは、Unicode{tm} 文字列を変換するために使用する文字セットコンバータを示します。

この例では、serif.1 および serif.2 は共に NEED_CONVERTED 引数を 持っています。両方とも次のとおり font.properties ファイルにフォント文字セットエントリを持っています:


fontcharset.serif.1=sun.awt.windows.CharToByteWingDings

fontcharset.serif.2=sun.awt.CharToByteSymbol

serif.1 のフォント文字セットエントリは、WingDings グリフを描画するためには Unicode{tm} 文字列を sun.awt.windows.CharToByteWingDings コンバータを使用して変換するよう指示しています。(font.properties ファイルが既に serif.1 のフォントを WingDings として設定したことを思い出してください。)

文字セットコンバータの仕様については、後節「文字セットコンバータ」を参照してください;

Win32 フォントファイル

現在の Win32 JDK 構築物は、次のフォントプロパティファイルを提供します:


./lib/font.properties

./lib/font.properties.ja

./lib/font.properties.ko

./lib/font.properties.zh

./lib/font.properties.zh_TW

提供されるフォントと異なるフォントが必要な場合、ユーザ独自のフォントプロパティファイルを生成する必要があります。

Solaris プラットフォームでのフォントの指定

Solaris font.properties ファイルは、フォントの指定で Win32 バージョンと異なるフォーマットを使用します。Solaris バージョンはプロポーショナルプラットフォームフォントでなく、固定幅を使用します。例えば、英語 Solaris プラットフォームのセリフフォントは次の固定幅フォントから構成されます。


serif.plain.0=-linotype-times-medium-r-normal--*-%d-*-*-p-*-iso8859-1

serif.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-
         fontspecific

serif.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific

serif.italic.0=-linotype-times-medium-i-normal--*-%d-*-*-p-*-iso8859-1

serif.bold.0=-linotype-times-bold-r-normal--*-%d-*-*-p-*-iso8859-1

serif.bolditalic.0=-linotype-times-bold-i-normal--*-%d-*-*-p-*-iso8859-1

Solaris font.properties ファイルのこれらの行は、異なる型を持つセリフフォントの添字を示します。例えば、書体名がセリフでスタイルがプレーンのフォントは、serif.plain.0serif.1 および serif.2 から構成されます。さらに、これらの行は斜体のセリフフォントが serif.italic.0serif.1 および serif.2 から構成されることを示します。

現在、Solaris (X11) フォントの添字は Unicode{tm} の添字ではありません。これが Unicode{tm} でないため、このフォントは常に変換する必要があります。各エントリは、次のように変換の方法を示す、対応するフォント文字セットエントリを持つ必要があります:


fontcharset.serif.0=sun.io.CharToByte8859_1 

fontcharset.serif.1=sun.awt.motif.CharToByteX11Dingbats

fontcharset.serif.2=sun.awt.CharToByteSymbol

例えば:

fontcharset.serif.0=sun.io.CharToByte8859_1 

この行はすべての serif.0 フォントを、型がプレーン(serif.plain.0)、太字(serif.bold.0)、斜体(serif.italic.0)または太字斜体(serif.bolditalic.0)であるかどうかに関わらず、sun.io.CharToByte8859_1 コンバータを使用して変換することを示します。

Solaris フォントファイル

現在の Solaris JDK 構築物は、次のフォントプロパティファイルを提供します:


./lib/font.properties

./lib/font.properties.ja

./lib/font.properties.ko

./lib/font.properties.zh

./lib/font.properties.zh_TW

./lib/font.properties.cs

./lib/font.properties.el

./lib/font.properties.hu

./lib/font.properties.lt

./lib/font.properties.lv

./lib/font.properties.pl

./lib/font.properties.ru

./lib/font.properties.tr

./lib/psfont.properties.ja

提供されるフォントと異なるフォントが必要な場合、ユーザ独自のフォントプロパティファイルを生成する必要があります。

文字セットコンバータ

charset コンバータは、Unicode{tm} または Java 文字列エンコーディングをフォントの添字に変換します。フォントの描画については、「JDK 1.1 ランタイム」は sun.io.CharToByteConverter のサブクラスである charset コンバータを使用します。

「JDK 1.1 ランタイム」に独自のフォントを追加するためには、charset コンバータを生成し、font.properties file 内でそれを指定する必要があります。

ユーザ独自のプラットフォームフォントを Java セリフフォントに追加する方法を、次の例で示します。この例では、ユーザのフォントとして 0 - 0xff の添字の付いた 256 グリフがあります。このフォントグリフは Unicode{tm} 0xe000 - 0xe0ff に対応します。この例は 2 つのステップに分かれます。最初に、ユーザの fontcharset コンバータクラスを生成します。次に、フォント名およびコンバータクラス名を font.properties file 内で指定します。

ステップ 1. フォント文字セットコンバータの生成

fontcharset コンバータを生成する Java コードを次に示します。


package mypkg.converter;
import sun.io.CharToByte8859_1;

public class CharToByteMyfont extends sun.io.CharToByte8859_1 {

/*
 * This method indicates the range this font covers.
 */
public boolean canConvert(char ch) {
   if (ch >= 0xe000 && ch <= 0xe0ff) {
       return true;
   }
   return false;
}

/**
 * This method converts the unicode to this font index.
 */
public int convert(char[] input, int inStart, int inEnd,
                   byte[] output, int outStart, int outEnd)
                   throws ConversionBufferFullException;
{
   int outIndex = outStart; 
   for (int i = inStart; i < inEnd; i++) {
        char ch = input[i];

        if (ch >= 0xe000 && ch <= 0xe0ff) {
            if (outIndex >= outEnd) 
            throw new ConversionBufferFullException();
            output[outIndex++] = (byte)(ch - 0xe000);
        }
   }
   return outIndex - outStart;
}
/*
 * This method indicates the charset name for this font.
 */
public String toString() {
   return "Myfont";
}
}

ステップ 2. プロパティファイルへのフォントおよびコンバータの追加

最初に、フォント名を font.properties file ファイルにセットする必要があります。そのためには、フォントの添字エントリを追加します。例えばセリフフォントについては、セリフフォントの後にファイル内の次の添字順番を付けたセリフフォントを指定する行を追加します。「Java ランタイム」は、すべてのフォントの添字番号が連続していることを要求します。

次に、前述の例の font.properties ファイルにセリフフォントを追加するために、次の行を挿入します:

serif.3=<your own font name>
添字番号は、プロパティファイルの中で次に高位の添字番号である必要があります。この例では、既に serif.0serif.1 および serif.2 を使用しています。そのため、新しいセリフフォントは serif.3 でなければなりません。serif.5 などの連続していない番号を使用した場合、「Java ランタイム」はそのエントリを使用しません。

次に、このフォントのコンバータを定義する必要があります。このためには、新しいフォントの fontcharset エントリが必要です。この場合、serif.3 です。次の行は、Java コード例で生成したコンバータを使用する fontcharset エントリです:

fontcharset.serif.3=mypkg.converter.CharToByteMyfont
ユーザはまた、新しく生成したコンバータが「Java ランタイム」から可視であることを保証する必要があります。ユーザのコンバータが「Java ランタイム」から可視であることを保証するためには、java アプリケーションの classpath が、そのコンバータへのクラスパスを含んでいる必要があります。この例では、クラス mypkg.converter.CharToByteMyfont が「Java ランタイム」に対して可視であることを確認する必要があります。この一番簡単な方法は、このクラスを $JDK_HOME/classes/myown/package ディレクトリの下に置くことです。