Unicode 字體支援


Java 1.0 平台僅限於顯示 Unicode 的 ISO-Latin-1 子集中的字符。Java 1.1 平台除去了這種限制。在 1.1 或 1.2 上運行的 Java 程式可以顯示可用主機字體來表達的 Unicode 字符。

運行時提供少量預定義的“虛擬”字體名,並將其映射為主機上可用的實際字體。在 1.0 中,每種 Java 字體名都被映射為一種主機字體。在 1.1 和 1.2 中,一種 Java 字體名可映射為一系列主機字體,可以選擇它們來涵蓋足夠多的 Unicode 字符集。字體映射在字體屬性文件中指定。

由於 Java 字體名是可以代表多種主機字體的虛擬名,因此它們自然還有普通名。JDK 1.0 包括字體名 TimesRoman、Courier 和 Helvetica,它們非常具體,在許多 locale 不適用。JDK 1.1 為這些名稱引入了三種替換名。Serif、SansSerif 和 MonoSpaced。因此建議您使用這些新名稱。

JDK 帶有字體屬性文件,涵蓋了所有被支援的 locale。對於一種被支援的 locale,必須有與其相應的字體屬性文件。

字體屬性文件

下例是一個字體屬性文件,其值可用於 Windows 平台:

#-------------------------------------------
serif.0.plain=Times New Roman
serif.1.plain=MS Mincho
# 任意樣式字體都將 WinDings 作為組件字體 2
# 將 Lucida Sans Unicode Regular 作為組件字體 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

#---------------------------------------

排除範圍可用與名稱映射相同的方法縮寫。完全指定的名稱優先於縮寫名稱。

支援用戶定義字符

許多最終用戶需要非標準字符的專用字體,特別是在日本市場中。這些字符在日本稱為 Gaiji。為支援 Gaiji 字體,Java 必須知道如何在 Gaiji 字體和 Unicode 之間映射。

例如,假定用戶有一種包含三種字形的字體。字形在字體中的索引為 0、1 和 2,用戶想要將其映射為 Unicode 字符 \uE800、\uE801、\uE802(Unicode 中的三種私人使用區字符)。可用以下的兩個步驟完成上述操作:

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;
	}

	// 此轉換方法實際上是由
	// 字體機制調用的
	public int convert(String str, byte[] out){
		for (int i = 0; i < str.length(); i++){
			out[i] = str.charAt(i) - 0xE800;
		}
		return str.length();
	}

	// 由於 convert 是 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=<特殊字體名>
...
fontcharset.serif.4=MyFontCharset
...
#----------------------------------------------------------------

一些日本公司(包括 Fujitsu 和 NEC)有其自己定義的字符(稱為廠商定義字符)。這種機制允許廠商擴展 Java,以便支援這些字符。




java-intl@java.sun.com

版權所有 © 1996-98 Sun Microsystems, Inc. 保留所有權利