关于制作TrueType字体(1)
Windows操作系统的附件中自带了一个TrueType造字程序(eudcedit.exe),日文下叫“外字Editor”。说实话,中文名字起得有点不对:让人觉得能造所有的字,其实它只能造一些外字。
所谓外字,是指不在标准字符范围内的字,或者用户自定义的一些字。系统为这些字提供了一个范围:
Unicode:E000~F8FF
ChineseGBK:AAA1~AFFE;F8A1~FEFE;A140~A7A0
Shift-JIS:F040~F9FC
这些范围是否一一对应呢?即在中文系统下每个该范围内的Unicode内码是否都能对应一个ChineseGBK内码呢?我们通过计算可以知道:
F8FF – E000 = 18FF (Unicode)
(AFFE – AAA1) + (FEFE – F8A1) + (A7A0 – A140) = 55D + 65D + 660 = 121A (ChineseGBK)
F9FC – F040 = 9BC (Shift-JIS)
并且,Unicode的范围是连续的,而ChineseGBK和Shift-JIS中还有好多区域不允许占用,由此可见他们并非一一对应。
这里有一个原则就是:尽量对应。可以做一个试验:选择Unicode内码,在E000、E757和E758处分别画一个字形。然后切换到Shift-JIS码(我用的是日文系统,中文系统中应切换为ChineseGBK码),然后就会发现:与uE000对应的Shift-JIS码是F040(Shift-JIS外字的第一个可用码);与uE757对应的是F9FC(Shift-JIS外字的最后一个可用码);没有Shift-JIS码与uE758对应。
自己做一个文本文件,用二进制编辑工具(如VC,UltraEdit等)输入上面的Unicode码,注意,输入时要反转字节顺序:FF FE 00 E0 57 E7 58 E7。前两个字节表示当前文本是Unicode文本文件,这样用Notepad或其他Editor工具打开时就不用再指定文字内码了,打开后可以看到我们所做的三个字符都可以正常显示;另存为Ansi内码的文件,系统会提示你转换时可能会丢失一些信息,忽视后继续,关闭后再次打开该Ansi内码的文件,可以看到前两个字符可以正常显示,后一个字符变成了问号,这是因为系统把第三个Unicode字符转换为Shift-JIS内码时,由于没在NLS中找到对应关系,而用缺省字符(问号)代替,各位可以参考MSDN中WideCharToMultiByte()的API说明。
制作的字体缺省保存在EUDC.TTE文件中,并且与所有字体关联,另外还有一个EUDC.EUF文件,也被放到同一目录下。
也可以把一个外字文件(.TTE)与一个指定的字体关联起来,注意:一个指定的字体只能和一个外字文件关联。
[HKEY_CURRENT_USER/EUDC/932]
"SystemDefaultEUDCFont"="C://WINDOWS//FONTS//EUDC.TTE"
"MS UI Gothic"="D://MakeFont//STRONGDOG.TTE"
[HKEY_CURRENT_USER/EUDC/936]
"SystemDefaultEUDCFont"="EUDC.TTE"
[HKEY_CURRENT_USER/EUDC/949]
"SystemDefaultEUDCFont"="EUDC.TTE"
[HKEY_CURRENT_USER/EUDC/950]
"SystemDefaultEUDCFont"="EUDC.TTE"
对于上面的注册表,说明如下:
1. EUDC(End User Defined Characters),即用户自定义字符,也就是用户自己制作的外字。
2. 932日文Codepage;936是简体中文;949是韩文;950是繁体中文
3. 每个Codepage都有"SystemDefaultEUDCFont"="EUDC.TTE"项,表示他们缺省的外字文件都是EUDC.TTE。
4. 当用MS UI Gothic字体显示文字时,系统会先在“STRONGDOG.TTE”中查找外字,如果没找到,才会去“EUDC.TTE”中查找;如果用其它字体显示文字,系统会直接在“EUDC.TTE”中查找外字。
5. 外字文件的路径可以自己指定。
6. 由于一个指定的字体只能和一个外字文件关联,如果大家都想和某个字体进行关联(如宋体),就会导致覆盖,即原来的外字可能找不到或改变了字形。
7.这里列出注册表主要是为了提示大家如何把一套外字安装到用户的机器上,在你本人的机器上,可以通过操作“TrueType造字程序”来完成相应的工作。