font.properties
ファイル内の xlfd 文字列が適正かどうかのテスト
このドキュメントでは、font.properties ファイルを編集して、Java Runtime にアジア系言語および他の言語のフォントを追加する方法を説明します。
今回このドキュメントでは、日本語、韓国語、中国語および繁体字中国語フォントのインストールの方法を説明します。
Win32 プラットフォーム用の Java 2 SDK は、TrueType フォントと Postscript Type1 フォントをサポートします。Solaris 用の Java 2 SDK では、X11 サーバで処理できる F3、Type1、TrueType などのスケーラブルなアウトラインフォントをサポートしています。
いくつかのfont.properties
ファイルは、Java 2 SDK にバンドルされています。これらのファイルは、Java がインストールされているディレクトリの下の../lib
ディレクトリにあります。これらのファイルには、標準フォント環境に関する情報が入っています。 これからの説明では、このドキュメントの読者が英語環境で作業しているものと仮定します。英語環境では、次のようにデフォルトのfont.properties
ファイルのファイル名には接尾辞を使用しません。ただし、オペレーティングシステムによってインストールされているフォントが違うので、名前に埋め込まれているオペレーティングシステム版数を使ってフォントプロパティファイルを読み取る機能があります。たとえば、Solaris 2.5.1 では TrueType フォントがサポートされないので、プロパティファイルfont.propertiesfont.properties.5.5.1
には、F3 フォントだけが含まれます。このため、次の名前のファイルを最初に検索します。この font.properties.<osVersion><osVersion>
は、ほとんどのシステムで、System.getProperty("os.version") によって返されるバージョンを指します。Windows NT では NT と 95 を区別するために、このメソッドはオーバーライドされて 4.0 ではなく NT 4.0 が返されます。しかし、使用環境が日本語、韓国語、中国語または繁体字中国語の場合、その特定の環境に対応する
font.properties
ファイルを使用する必要があります。これらのファイルは、次のようにファイル名に国またはロケール接尾辞を追加して識別します。ただし、font.properties.<locale>locale
は次のうちの 1 つです。使用する特定のフォントを示す接尾辞付きファイルを選択します。繁体字中国語の場合はja ko zh zh_TW ...font.properties.zh_TW
ファイルにアクセスします。注:
<locale>
は、実際には<language>_<region>_<encoding>
で構成されます。
<language>
は、System.getProperty("user.language")
から返される文字列
<region>
は、System.getProperty("user.region")
から返される文字列
<encoding>
は、System.getProperty("file.encoding")
から返される文字列この
font.properties.<locale>
の名前には、オペレーティングシステムのバージョンも付け加えられる場合があります。要約すると、フォントプロパティファイルは、次の順番で検索されます。font.properties.<language>_<region>_<encoding>.<osVersion> font.properties.<language>_<region>_<encoding> font.properties.<language>_<region>.<osVersion> font.properties.<language>_<region> font.properties.<language>_<encoding>.<osVersion> font.properties.<language>_<encoding> font.properties.<language>_<osVersion> font.properties.<language> font.properties.<encoding>.<osVersion> font.properties.<encoding> font.properties.<osVersion> font.properties
Java Runtime にフォントを追加するには、font.properties
ファイルを操作する必要があります。font.properties
ファイルは、プラットフォーム固有のファイルです。このファイルは、特定のプラットフォームで Java 仮想フォントとして使用されるフォントを示します。フォントは、タイプまたはクラスによってグループ化されます。現在、Java Runtime は次のクラスの論理フォントをサポートしています。
- Serif
- Sans-serif
- Monospace
- Dialog
- DialogInput
また、次のフォントスタイルをサポートしています。
- プレーン
- 太字
- 斜体
- 太字斜体
font.properties
ファイルは、プラットフォームのフォントに関する特定の情報を定義します。この中には次のような別名があります。注: timesroman および helvetica は実在のフォント名ですが、Java 2 Platform では仮想フォントにこれらの別名をつけることはないので、これは良い例とはいえません。serif、sans serif に対して「Times」、「Helvetica」という名前を付けないでください。alias.timesroman=serif alias.helvetica=sansserifこれにはフォントの記述も入っています。この記述は、Win32 および Solaris プラットフォームの間では異なります。例ではセリフフォントを使用して、必要に応じたフォントの指定と変換の方法を説明しています。しかし、同じエントリが他の型のフォントにも適用されます。 一般的に、フォントプロパティファイルにはユーザが使用したいフォントを指定するエントリがあります。 一般的に、フォントプロパティファイルにはユーザが使用したいフォントを指定するエントリがあります。これらのエントリは次のようなフォーマットを持っています。
<virtual font name>.<style>.<index number> = <platform font name>, attributesvirtual font name は、Java Runtime が認識するフォントの名前です。platform font name は、プラットフォームの実際のフォント名です。たとえば、Dialog および Serif は Java フォント名であり、Times および Helvetica は Win32 または Solaris プラットフォームのネイティブフォント名です。index number はゼロを最高の優先順位として、フォントグリフを照合するための検索順序を指定します。Java 2 Platform では、virtual font name と style のマトリックスが完全でなければなりません。たとえば、
serif
、serif.bold
、serif.italic
、serif.bolditalic
のようにする必要があります。serif
はserif.plain
に相当します。このファイル内の名前は、すべて大文字と小文字を区別しません。たとえば、JDK 1.1 の Solaris の
font.properties
ファイルでは、serif
エントリは次のとおりです。上記のように、「serif.plain」、「serif.italic」、「serif.bold」および「serif.bolditalic」の最初のエントリだけが指定されています。フォントの 2 つ目および 3 つ目のエントリは、デフォルトの「serif.1」および「serif.2」になります (各「serif」フォントスタイルに同じ 2 つのフォントが使われたため)。しかし、Java 2 SDK の font.properties には、マトリックス全体を指定しなければなりません。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前述のとおり、serif.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.italic.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific serif.italic.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific serif.bold.0=-linotype-times-bold-r-normal--*-%d-*-*-p-*-iso8859-1 serif.bold.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific serif.bold.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific serif.bolditalic.0=-linotype-times-bold-i-normal--*-%d-*-*-p-*-iso8859-1 serif.bolditalic.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific serif.bolditalic.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecificplain
スタイルの基本値であるplain
は指定する必要がありません (serif.0
はデフォルトでplain
スタイルになる)。 ただし、italic
、bold
、およびbolditalic
は明示的に指定する必要があります。
英語環境プラットフォーム上で日本語フォントなどのロケール固有のフォントを使用するためには、 2 つのステップを実行する必要があります。ステップ 1: フォントのインストール
最初に、日本語、韓国語、中国語、繁体字中国語などのロケール固有のフォントを、使用しているシステムにインストールする必要があります。 Windows プラットフォームユーザについては、Microsoft はこれらのアジアフォントを、NT4.0 インストレーション CD に添付して配布しています。あるいは、これらのフォントを Microsoft World Wide Web ホームページからダウンロードできます。 Solaris ユーザは Sun に連絡を取り、Solaris 環境のアジアアウトラインフォントをお求めください。
ステップ 2: フォントのコピー
システムにフォントをインストールしたあと、目的のフォントの記述を
font.properties
にコピーします。アジア語フォントを 1 つ追加するもっとも簡単な方法は、font.properties.<locale> ファイルの名前を変更して新しいfont.properties
ファイルを作成することです。ロケールシンボルはユーザの目的のフォント名を表します。font.properties
を font.properties.<locale> で置換するとき、編集は必要ありません。 それは、font.properties.<locale> がfont.properties
のスーパーセットだからです。 異なるフォントプロパティファイルを指定するのは、次に示すロケールシンボルです。フォントのロケールシンボル
フォント名 font.properties
シンボル日本語 ja
韓国語 ko
中国語 zh
中国語 (繁体字) zh_TW
たとえば、韓国語フォントを使用するためには、
font.properties.ko
をfont.properties
にコピーまたは名前を変更します。
Runtime で複数のアジア語フォントを使用することができます。このためには、font.properties
ファイルを編集する必要があります。この節では、複数のアジア語フォントを使用するために必要なファイルの編集について説明します。Win32 プラットフォームでのフォントの指定
英語版 Win32 プラットフォームには、使用可能な既定のセリフフォントが 3 つあります。そのフォントは次のとおりです。
- Arial
- WingDings
- 記号
さらに、
font.properties
ファイル内のセリフフォントの説明は、次のとおりです。上記の 3 行はこのプラットフォーム上で使用可能な 3 つのセリフフォントのインデックスを示します。各行は 1 つのセリフフォントを示し、後ろにそのフォントの 3 つの引数が付きます。serif.0=Arial,ANSI_CHARSET serif.1=WingDings,SYMBOL_CHARSET,NEED_CONVERTED serif.2=Symbol,SYMBOL_CHARSET,NEED_CONVERTED
serif.0
などのserif
という語のあとに表示されている数字 (0、1、2) は、Unicode、または 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 でアクセスできないことを示します。この引数が存在するとき、Java Runtime は、フォントのグリフの使用を試みる前に、 Unicode 文字列をこのフォントのインデックスに変換する必要があります。このNEED_CONVERTED
引数を持つフォントは、対応するフォント文字セットエントリを持つ必要があります。 このエントリは、Unicode 文字列を変換するために使用する文字セットコンバータを示します。この例では、serif.1 および serif.2 はともに
NEED_CONVERTED
引数を持っています。両方とも次のように font.properties ファイルにフォント文字セットエントリを持っています。fontcharset.serif.1=sun.awt.windows.CharToByteWingDings fontcharset.serif.2=sun.awt.CharToByteSymbolserif.1
のフォント文字セットエントリは、WingDings グリフを描画するためには Unicode 文字列をsun.awt.windows.CharToByteWingDings
コンバータを使用して変換するよう指示しています。なお、font.properties ファイルでは、すでにserif.1
のフォントが WingDings として設定されています。文字セットコンバータの仕様については、後述の節「文字セットコンバータ」を参照してください。
注: Java 2 Platform の現在の実装では、
NEED_CONVERTED
は使われていません。フォントファイル名
初期化にかかる時間を減らすために、現在では論理フォント名から物理フォント名へのマッピングを指定する方法があります。たとえば、次のようにします。最初のエントリは、フォント名filename.Arial=ARIAL.TTF filename.Arial_Bold=ARIALBD.TTF filename.Arial_Italic=ARIALI.TTF filename.Arial_Bold_Italic=ARIALBI.TTFArial
と物理フォント名ARIAL.TTF
との間のマッピングを示しています。以降のエントリは、ほかのスタイルが適用された Arial のマッピングを示しています。これにより、各フォントファイルを開いて特定の名前のフォントを探す必要がなくなるので、初期化時間が短くなります。Win32 フォントファイル
現在の Win32 JDK は、次のフォントプロパティファイルを提供します。
提供されるフォントと異なるフォントが必要な場合、ユーザ独自のフォントプロパティファイルを生成する必要があります。./lib/font.properties ./lib/font.properties.ar ./lib/font.properties.iw ./lib/font.properties.ja ./lib/font.properties.ko ./lib/font.properties.ru ./lib/font.properties.th ./lib/font.properties.zh ./lib/font.properties.zh.NT4.0 ./lib/font.properties.zh_TWSolaris プラットフォームでのフォントの指定
Java 2 SDK では、font.properties ファイル内に指定されたフォントは、スケーラブルフォントを参照する必要があります。しかし、これは特定のフォントのポイントサイズが要求されたときに、スケーラブルフォントが必ず使われるという意味ではありません。次の xlfd 文字列が与えられた場合の X11 の動作について説明します。
-adobe-courier-bold-o-normal--10-100-75-75-m-60-iso8859-1X11 は、Xserver が、最初に xlfd 文字列内で見つかったエントリ (フォント開発元、フォントファミリ、スタイル、スラント、エンコーディングなど) に一致するスケーラブルフォントを検索するように動作します。ただし、次に xlfd 文字列の特定のピクセルやポイントサイズ (この場合は 10 pt) に正確に一致するビットマップフォントを検索します。該当するビットマップフォントが見つかった場合は、X11 は、スケーラブルフォントファイル内で見つかったデータから生成されたビットマップではなく、使用されるビットマップフォントファイルから直接読み取ったビットマップを返します。
たとえば、英語版 Solaris (2.6+) プラットフォーム上で
serif
フォントは、次のフォントで構成されます。
serif.0=-monotype-times new roman-regular-r---*-%d-*-*-p-*-iso8859-1 serif.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific serif.2=-*-symbol-medium-r-normal-*-*-%d-*-*-p-*-adobe-symbol serif.italic.0=-monotype-times new roman-regular-i---*-%d-*-*-p-*-iso8859-1 serif.italic.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific serif.italic.2=-*-symbol-medium-r-normal-*-*-%d-*-*-p-*-adobe-symbol serif.bold.0=-monotype-times new roman-bold-r---*-%d-*-*-p-*-iso8859-1 serif.bold.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific serif.bold.2=-*-symbol-medium-r-normal-*-*-%d-*-*-p-*-adobe-symbol serif.bolditalic.0=-monotype-times new roman-bold-i---*-%d-*-*-p-*-iso8859-1 serif.bolditalic.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific serif.bolditalic.2=-*-symbol-medium-r-normal-*-*-%d-*-*-p-*-adobe-symbolSolaris での
font.properties
ファイルのこれらの行は、異なる型を持つセリフフォントのインデックスを示します。たとえば、書体名がセリフでスタイルがプレーンのフォントは、serif.0
、serif.1
、およびserif.2
から構成されます。さらに、これらの行は斜体のセリフフォントがserif.italic.0
、serif.italic.1
およびserif.italic.2
から構成されることを示します。現在、Solaris (X11) フォントのインデックスは Unicode の添え字ではありません。これが Unicode でないため、このフォントは常に変換する必要があります。各エントリは、次のように変換の方法を示す、対応するフォント文字セットエントリを持つ必要があります。
例: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_1serif.0
フォントを、タイプがプレーン (serif.plain.0
)、太字 (serif.bold.0
)、斜体 (serif.italic.0
) または太字斜体 (serif.bolditalic.0
) であるかどうかにかかわらず、sun.io.CharToByte8859_1
コンバータを使用して変換することを示します。
font.properties
ファイル内の xlfd 文字列が適正かどうかのテストスケーラブルフォントを指定しなければならないのは、Java2D がアウトラインの生成などの特定の操作を、スケーラブルファイルに対してしか実行できないためです。現在、Java2D コードは、TrueType、Type1、F3などのスケーラブルフォントを認識できます。このため、font.properties ファイルに xlfd 文字列を入力する場合は、これらのタイプのフォントがシステムにインストールされているのを探し、これらを指定します。TrueType フォントの拡張子は、通常は「ttf」です。Type 1 フォントの拡張子は、「pfa」か「pfb」です。F3 フォントの拡張子は「f3b」です。Solaris 2.6 の「C」ロケールですべてのパッケージがインストールされている環境では、これらの形式のフォントは次の場所にあります。
Type1:/usr/openwin/lib/X11/fonts/Type1 TrueType:/usr/openwin/lib/X11/fonts/TrueType F3:/usr/openwin/lib/X11/fonts/F3そのほかのロケールでは、フォントは /usr/openwin/lib/locale/
などのディレクトリにインストールされます。たとえば、/usr/openwin/lib/locale/ja の下の JA ロケールでは、次の場所にフォントがインストールされます。
TrueType:/usr/openwin/lib/locale/ja/X11/fonts/TT F3:/usr/openwin/lib/locale/ja/X11/fonts/F3フォントファイルの位置はロケールによって異なり、必ずしも常に /usr/openwin/lib/locale/<locale>/X11/fonts にあるとは限りませんが、一般的に /usr/openwin/lib/locale/<locale> ディレクトリの下のどこかに置かれます。
スケーラブルフォントが検索されたら、スケーラブルフォントファイルと同じディレクトリ内にある fonts.dir ファイルを探します。このファイルには、そのディレクトリ内に格納されるフォントのすべての有効な xlfd 文字列を一覧にしてあります。たとえば、
/usr/openwin/lib/locale/ja/X11/fonts/TT
ディレクトリ内にある fonts.dir ファイルには、次のようなエントリがあります。
HG-MinchoL.ttf -ricoh-hg mincho l-medium-r-normal--0-0-0-0-m-0-jisx0208.1983-0xlfd 文字列内に、ゼロ (0) が 4 つ連続した値があります。これらは、ピクセルサイズ、ポイントサイズ、解像度 x および解像度 y の値を示しています。この xlfd 文字列を font.properties エントリにコピーする場合は、必ず、ポイントサイズ (2 番目の 0) を「%d」に置き換えるようにします。 「%d」は、あとでフォントが使用されるときに特定のポイントサイズに置換されます。また、その他の 0 の値を * (アスタリスク) に置き換えると、任意の値がこのフィールドに一致することを示します。たとえば、上のフォントが font.properties ファイル内で指定された serif フォントのエントリとして使われる場合は、次のようになります。
serif.1=-ricoh-hg mincho l-medium-r-normal--*-%d-*-*-m-*-jisx0208.1983-0実際にフォントが使われるときは、Java Font オブジェクトが作成されたときに指定されたポイントサイズが使われ (「%d」がこの値に置換される)、フォントは初期化されてそのポイントサイズで使用されます。
font.properties ファイル内に入力した xlfd 文字列が正しいかどうかを検証するには、「xfd」を使ってそのフォントを表示してみる方法があります。「xfd」は /usr/openwin/bin 内の X11 アプリケーションで、フォント内に見つかったすべての文字を表示します。このアプリケーションを実行するには、xlfd 文字列としてフォントを指定します。font.properties ファイル内の xlfd エントリを検証するには、「%d」を 120 (12 pt)、140 (14 pt)、160 (16 pt) などの有効なポイントサイズに置き換えます (xlfd ポイントサイズは、通常フォントポイントサイズとして知られている「ピクセルサイズ」の 10 倍ににあたる)。日本語の font.properties ファイルへの「serif.1」のエントリである上の例では、この xlfd 文字列が正しいことを検証するには、以下を実行します。
% xfd -fn "-ricoh-hg mincho l-medium-r-normal--*-140-*-*-m-*-jisx0208.1983-0"xlfd 文字列が正しくない場合は、xfd はウィンドウを表示せず、即座に終了してから次のようなエラーメッセージを出力します。
Warning:Cannot convert string "<xlfd string>" to type FontStruct xfd:no font to displayxlfd 文字列が正しい場合は、そのフォントに指定されたすべての文字を示すウィンドウが表示されます。文字が 256 文字より多い場合は、最初の 256 文字だけが表示されますが、アプリケーションに表示された [NextPage] ボタンをクリックして、すべてのエントリを見ることができます。
スケーラブルフォントについての注
font.properties ファイルに指定されるフォントの形式は、上記に示した形式 (TrueType、Type1、または F3) のうちの 1 つでなければなりません。これらの形式のフォントがシステムにインストールされていない場合、Java2D は有効なフォントを見つけられないため、drawString ("some Text") などの操作ができません。
Type1 フォント対応の X サーバーにもバグがある (2.6 よりも 2.5.1 に問題が多い) ため、Type1 フォントの使用も避けることをお勧めします。
Solaris フォントファイル
Java 2 SDK のフォントプロパティファイルは、jre/lib ディレクトリにあります。Java 2 Runtime Environment の場合は、lib ディレクトリにあります。バージョン 1.3 の SDK および Runtime Environment では、次のフォントプロパティファイルが提供されていました。
font.properties font.properties.5.5.1 font.properties.ISO8859_15_FDIS font.properties.UTF8 font.properties.UTF8.5.6 font.properties.UTF8.5.7 font.properties.cs font.properties.el font.properties.hu font.properties.ja font.properties.ja.5.5.1 font.properties.ko font.properties.ko.5.5.1 font.properties.ko.5.6 font.properties.ko.5.7 font.properties.ko_KR_UTF8 font.properties.ko_KR_UTF8.5.6 font.properties.ko_KR_UTF8.5.6 font.properties.lt font.properties.lt_ISO8859_13 font.properties.lv font.properties.lv_ISO8859_13 font.properties.pl font.properties.ru font.properties.tr font.properties.zh_CN_UTF8 font.properties.zh_EUC_CN font.properties.zh_EUC_CN.5.5.1 font.properties.zh_GBK font.properties.zh_TW_Big5 font.properties.zh_TW_Big5.5.5.1 font.properties.zh_TW_Big5.5.6 font.properties.zh_TW_EUC_TW font.properties.zh_TW_EUC_TW.5.5.1 font.properties.zh_TW_UTF8提供されるフォントと異なるフォントが必要な場合、ユーザ独自のフォントプロパティファイルを生成する必要があります。
除外範囲
前の項で述べたように、仮想フォント名のうしろにある数は、要求されたグリフを見つけるために実際のフォントを検索する順序を示します。仮想フォントを構成する各物理フォントでは、グリフの範囲が重複することがあります。除外範囲を追加して、物理フォント内でグリフを検索する範囲を制限できます。たとえば、Solaris font.properties.ja ファイルでは、以下はモノスペースフォントを表しています。
対応する除外範囲は次のとおりです。monospaced.plain.0=-morisawa-gothic medium bbb-medium-r-normal-sans-*-%d-*-*-m-*-jisx0201.1976-0 monospaced.plain.1=-morisawa-gothic medium bbb-medium-r-normal-sans-*-%d-*-*-m-*-jisx0208.1983-0 monospaced.plain.2=-morisawa-gothic medium bbb-medium-r-normal-sans-*-%d-*-*-m-*-jisx0201.1976-0 monospaced.plain.3=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific monospaced.plain.4=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecificexclusion.monospaced.0=0080-ffffしたがって、Unicode 0x0080 から Unicode 0xffff までの範囲のグリフが仮想フォントの最初のフォントから除外されるので、以降のフォント (monospaced.plain.1、monospaced.plain.2、monospaced.plain.3、monospaced.plain.4) でこれらのグリフの検索が行われます。
charset
コンバータは、Unicode または Java 文字列エンコーディングをフォントのインデックスに変換します。フォントの描画については、実行環境はsun.io.CharToByteConverter
のサブクラスであるcharset
コンバータを使用します。実行環境に独自のフォントを追加するためには、
charset
コンバータを生成し、font.properties file
内でそれを指定する必要があります。ユーザ独自のプラットフォームフォントを Java セリフフォントに追加する方法を、次の例に示します。この例では、ユーザのフォントとして 0 - 0xff のインデックスの付いた 256 グリフがあります。このフォントグリフは Unicode 0xe000 - 0xe0ff に対応します。この例は 2 つのステップに分かれます。最初に、ユーザの
fontcharset
コンバータクラスを生成します。次に、フォント名およびコンバータクラス名をfont.properties file
内で指定します。ステップ 1. フォント文字セットコンバータの生成
fontcharset
コンバータを生成する Java コードを次に示します。package mypkg.converter; import sun.io.CharToByte8859_1; import sun.io.CharToByteConverter; import sun.io.ConversionBufferFullException; 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
ファイルに設定する必要があります。そのためには、フォントのインデックスエントリを追加します。たとえば、セリフフォントについては、セリフフォントのあとにファイル内の次のインデックス順番を付けたセリフフォントを指定する行を追加します。Java Runtime は、すべてのフォントのインデックス番号が連続していることを要求します。次に、前述の例の font.properties ファイルにセリフフォントを追加するために、次の行を挿入します。
インデックス番号は、プロパティファイルの中で 2 番目に高いインデックス番号である必要があります。この例では、すでにserif.3=<your own font name>serif.0
、serif.1
およびserif.2
を使用しています。そのため、新しいセリフフォントはserif.3
でなければなりません。serif.5
などの連続していない番号を使用した場合、Java Runtime はそのエントリを使用しません。次に、このフォントのコンバータを定義する必要があります。このためには、新しいフォントの
fontcharset
エントリが必要です。 この場合、serif.3
です。次の行は、Java コード例で生成したコンバータを使用するfontcharset
エントリです。ユーザはまた、新しく生成したコンバータが Java Runtime から可視であることを保証する必要があります。ユーザのコンバータが Java Runtime から可視であることを保証するためには、java アプリケーションのfontcharset.serif.3=mypkg.converter.CharToByteMyfontclasspath
が、そのコンバータへのクラスパスを含んでいる必要があります。この例では、クラスmypkg.converter.CharToByteMyfont
が Java Runtime に対して可視であることを確認する必要があります。この一番簡単な方法は、このクラスを$JDK_HOME/classes/myown/package
ディレクトリの下に置くことです。
カスタム font.properties ファイルをデバッグするもっともよい方法は、既存のファイルと比較することです。まず、osversion、region、encoding、language に基づいて、正しい font.properties ファイルを探す必要があります。カスタムファイルとこの標準ファイルとの違いを確認する場合、代わりに使用するフォント (および除外範囲など、そのフォントに関連するその他のフィールド) 以外は同じでなければなりません。次に demo/applets/SymbolTest 内の SymbolTest などのテストを実行して、標準の論理フォントが表示されるかどうかを調べます。