Unicode フォントのサポート


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 には、サポートされているすべてのロケールに対応するフォントプロパティファイルが付属しています。つまり、サポートされているロケールについては、適切なフォントプロパティファイルが存在しています。

フォントプロパティファイル

次の例は、Windows のプラットフォームで使うことのできるフォントプロパティファイルの内容です。

#-------------------------------------------
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
#---------------------------------------
名前のマッピングの場合と同じように、除外範囲も省略して指定できます。完全に指定した名前の方が、省略した指定より優先的に使用されます。

ユーザ定義文字のサポート

特に日本市場では、標準外の文字のために特別なフォントが必要になることがよくあります。このような文字を外字と呼びます。外字フォントをサポートするには、外字フォントと Unicode の間のマッピング方法を Java に指定する必要があります。

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 を拡張し、外字をサポートできます。




java-intl@java.sun.com
Copyright © 1996-98 Sun Microsystems, Inc. All rights reserved.