Java 1.0 のプラットフォームで表示できるフォントは、Unicode の ISO-Latin-1 サブセットの文字だけに制限されていました。Java 1.1 のプラットフォームでは、この制約はなくなっています。1.1 または 1.2 で実行される Java プログラムは、ホストのフォントでレンダリングできる任意の Unicode 文字を表示できます。
実行環境では、少数の定義済み「仮想」フォント名が提供されていて、ホストで利用できる実際のフォントにマッピングされています。1.0 では、Java フォント名のそれぞれが、厳密に 1 つのホストフォントにマッピングされていました。1.1 と 1.2 では、Java のフォント名を一連のホストフォントにマッピングできます。ホストフォントは、必要な Unicode 文字セットをすべて含むように選択できます。フォントのマッピングは、フォントプロパティファイルで指定されています。
Java のフォント名は、複数のホストフォントを表すことのできる仮想的な名前なので、ホストフォントの総称名と考えることができます。JDK 1.0 には TimesRoman、Courier、および Helvetica というフォント名が含まれていましたが、これらは非常に限定的なもので、適用されないロケールが多くありました。JDK 1.1 では、これらに代わる名前として、Serif、SansSerif、MonoSpaced の 3 つが導入されました。これら新しい名前の使用が推奨されます。
JDK には、サポートされているすべてのロケールに対応するフォントプロパティファイルが付属しています。つまり、サポートされているロケールについては、適切なフォントプロパティファイルが存在しています。
#-------------------------------------------
serif.0.plain=Times New Roman
serif.1.plain=MS Mincho
# Any style fonts use WinDings as component font 2
# and Lucida Sans Unicode Regular as component font 3.
serif.2=WingDings
serif.3=Lucida Sans Unicode Regular
...
sansserif.0.italic=Helvetica
sansserif.1.italic=MS Gothic
....
....
#-------------------------------------------
<抽象名>.<コンポーネントフォント番号>.<スタイル名>スタイル名を省略すると、そのファミリのすべてのフォントにマッピングが適用されます。完全に指定したマッピングの方が、スタイル名を省略したマッピングより優先的に使用されます。コンポーネントフォント番号は、各ホストフォントに対する優先順位を指定するものです。Unicode 文字を表示できるフォントがマッピングの中に複数ある場合は、もっとも小さいコンポーネント番号のフォントが使われます。
フォントプロパティファイルでは、所定のマッピングではレンダリングできない文字の代わりに表示するデフォルトの文字も指定できます。デフォルトの文字は、次のように、Unicode の値で指定します。デフォルト文字をマッピングできない場合は、ASCII 文字の「?」が使われます。
#-----------------------------------古いフォント名に対する新しいフォント名の別名指定は、次のエントリで行います。
default.char=274f
#-----------------------------------
#--------------------------------複数のホストフォントがオーバーラップしている場合、ホストフォントの優先順位の順序だけでは、目的のマッピングを指定できない場合があります。ホストフォントに除外範囲を設定し、そのフォントでの表示を禁止する文字を指定できます。次は、この設定の例です。
alias.timesroman=serif
alias.helvetica=sansserif
alias.courier=monospaced
#-----------------------------------
#---------------------------------------名前のマッピングの場合と同じように、除外範囲も省略して指定できます。完全に指定した名前の方が、省略した指定より優先的に使用されます。
exclusion.sansserif.1=xxxx-XXXX
exclusion.monospaced.plain.2=xxxx-XXXX
#---------------------------------------
3 つのグリフを含む外字フォントを例にします。フォントではグリフに 0、1、および 2 というインデックスが設定されていて、これらを Unicode 文字の ¥uE800、¥uE801、¥uE802 (Unicode の Private Use Area にある 3 つの文字) にマッピングするものとします。この設定は、次の 2 つの手順で実行できます。
1. サブクラス CharToByteConvertor (またはそのサブクラスのどれか) を作成します。
class MyFontCharset extends CharToByteSingleByte { private String name; public MyFontCharset(){ name = "MyGaiji"; } public boolean isConvert(char ch){ if (ch >= 0xE800 && ch <= 0xE802) return true; else return false; } // this is the conversion method actually called by // the font mechanism public int convert(String str, byte[] out){ for (int i = 0; i < str.length(); i++){ out[i] = str.charAt(i) - 0xE800; } return str.length(); } // needed as convert is an abstract method in // CharToByteConversion public int convert(char ch[],int off,int len, byte b[], int boff, int blen){ String str = new String(ch, off, len); byte bb[] = new byte[blen-boff]; System.arraycopy(b,boff,bb,0,bb.length); return convert(str, bb); } public String toString(){ return name; } }
2. 次のように、プロパティでこのクラスを指定します。
#------------------------------------------------------------ ... serif.4=<special font name> ... fontcharset.serif.4=MyFontCharset ... #----------------------------------------------------------------富士通や NEC など一部の日本企業は、独自に文字を定義しています (ベンダー定義文字)。ベンダーは、この機構を使って Java を拡張し、外字をサポートできます。