wxPython支持多种字体编码。
在这里,我们所说的编码是指字符代码和字母之间的映射关系。或许最广为人知的编码是(7位的)美国信息交换标准代码(ASCII)编码,如今它几乎被普遍用于表示英文字母表中的字母以及一些其他常见字符。然而,仅靠它来表示其他非英语字母表中的字母是不够的,这时其他编码就派上用场了。请注意,我们在此仅讨论8位字体编码,而不涉及统一码(Unicode)。
字体编码支持由几个类来确保:包括Font类本身,还有wx.FontEnumerator类和wx.FontMapper类。wx.Font的编码支持通过一个(新的)构造函数参数encoding来体现,该参数可接受以下值之一(枚举类型wx.FontEncoding的成员):
| wx.FONTENCODING_SYSTEM | 底层操作系统的默认编码(请注意,对于非英文版本的Windows 9x/NT系统而言,这可能是一种“外文”编码)。 |
|---|---|
| wx.FONTENCODING_DEFAULT | 由wx.Font.GetDefaultEncoding返回的应用程序默认编码。在程序启动时,应用程序的默认编码与wx.FONTENCODING_SYSTEM相同,但(默认情况下)可以进行更改,以便使之后创建的所有字体都使用该编码。 |
| wx.FONTENCODING_ISO8859_1..15 | ISO8859系列编码,通常被所有非微软操作系统所使用。 |
| wx.FONTENCODING_KOI8 | 用于互联网的标准西里尔字母编码(但也请参阅wx.FONTENCODING_ISO8859_5和wx.FONTENCODING_CP1251)。 |
| wx.FONTENCODING_CP1250 | ISO8859-2的微软等效编码 |
| wx.FONTENCODING_CP1251 | ISO8859-5的微软等效编码 |
| wx.FONTENCODING_CP1252 | ISO8859-1的微软等效编码 |
如你所见,微软的编码在一定程度上与标准的ISO8859编码相对应,但即便在ISO8859-1(拉丁字母1,用于西欧的ISO编码)和CP1251(Windows英文版本的标准代码页WinLatin1)之间也存在(细微的)差异,而对于其他编码来说,差异则更多。
西里尔字母编码的情况尤其复杂,因为存在(不止)三种互不兼容的编码:KOI8(旧标准,在互联网上广泛使用)、ISO8859-5(西里尔字母的ISO标准编码)以及CP1251(Windows系统的西里尔字母编码,即 WinCyrillic)。
如此繁多(且互不兼容)的编码情况清楚地表明,使用编码并不像看起来那么容易。问题的产生一方面是因为对于特定语言(比如用西里尔字母书写的俄语)来说,不同平台上的标准编码各不相同;另一方面则是因为给定编码的字体可能根本就没有安装(这在Unix系统中,或者更普遍地说,在非Win32系统中,尤其是个问题)。
需要说明的是,wx.FontEnumerator类既可以用于枚举所有可用的编码,也可以用于查找存在给定编码的字体系列名称。如果你能够使用wx.FontEnumerator找到具有正确编码的字体,那么问题就解决了。但遗憾的是,有时候这还不够。例如,在Windows系统上,没有标准的方法(据我所知是没有的,如果你知道有,请告诉我!)来查找适用于KOI8编码的字体(只能找到适用于Windows西里尔字母编码的字体,而这两种编码差异很大),所以即使用户在其系统上安装了KOI8编码的字体,wx.FontEnumerator也永远不会返回这样的字体。
wx.FontMapper类用于解决这个问题。
这个类在wx.ConfigBase对象中存储了编码与支持这些编码的字体系列名称之间的映射关系。当然,如果它试图自行确定这些映射关系,那基本上是没有用的。所以,相反,它(可选择地)会询问用户并记住用户的回答,这样下次程序就能自动选择正确的字体了。