文字显示3——字体

这个系列前两文章:

 

文字显示1——字符与编码

文字显示2——C++字符串与字符编码

 

字体

字符编码后只是一个数字,当要显示一个字体时,就需要用到字体,我们需要根据字符从字体种取出对应的图片信息,然后显示。

 

字体类型

点阵字体与轮廓字体

最早的字体是点阵字体,点阵字体通过一个点阵上的点来描述字体,如下图,分别时16*16和24*24点阵表示“点”字。

点阵字体有一个很大的缺陷就是,对字体缩放会失真,特别是放大,放大后可以明显看到一个个的点,对应字体显示效果很不好。如下图是点阵宋体12号与72号字显示对比。

 

轮廓字解决字体不能缩放的问题,轮廓字体记录的是字体的轮廓,也就字体中每一笔的线条,因为记录的是线条,所以字体缩放时可以重新绘制线条计算字体图形,从而保证字体不会失真。如下图是轮廓字体宋体12号与72号字显示对比。

 

目前点阵字体已经很少了,基本使用的都是轮廓字体。常见的轮廓字体有TrueType字体,字体文件扩展名为“*.ttf“;Open Type字体,字体文件扩展名为“*.otf“,Windows可以直接安装的字体为True Type字体。

 

文字宽度

字体还分为等宽字体与变宽字体,等宽字体是在同一字号下ASCII字符的宽度都是一样,中文字符的宽度为两个英文字符的宽度,变宽字体在同一字号下字符宽度是不相等的。如下图:

变宽字体更适合阅读,因为平时书写的文字字符宽度也是变宽的,符和阅读习惯,文字显示一般都会使用变宽字体。等宽字体因为字符宽度一样,所以文字对齐就非常容易,编程中代码的显示用的都是等宽字体。

 

字体字符

一个字体文件中会包含多个字符,windows系统中使用的都是True Type轮廓字体,系统中安装的字体都可以在” C:\Windows\Fonts”文件夹中找到。现在字体基本都是按照Unicode编码进行字符映射的,字符也是按照Unicode编码顺序排列的。虽然是按Unicode编码顺序映射但是字体中通常不会包含所有的Unicode字符,例如英文字体只会包含英文字符,中文字体不会包含一些特殊语言(韩语,日语)的字符。

 

英文字体,因为英文字符少所以包含的字符也可以比很少,例如“Bell MT”字体只包含了243个字符。有些“英文字体”中包含了多种语言,例如”Arial“字体,其中包含了4503个字符,其没有包含中日韩语言,包含了许多其他语言和一些特殊符号的字符。

 

中文字体,中文最早的编码是GB2312,GB2312中有6763个文字,有些中文字体只会包含GB2312中的字符,这种字体一般包含七八千个字符,多出来的字符一般是英文字符已经一些特殊符号。因为GB2312中不包含繁体文字编码,所以这种字体不支持繁体显示。中文后面有了GBK编码,GBK中有23940个文字,现在很多中文字体都包含了GBK中的字符。包含GBK编码的中文字体字符个数在两万以上。因为GBK包含了简体和繁体文字,所以这种字体同时支持简体和繁体显示。虽然中文字体中包含的是GBK/GB2312中的字符,但文字是按照Unicode排列的。

 

Google Noto字体,这是开源字体可以免费使用,该字体的目的在于用一种字体显示所有的语言。因为其要包含所有的语言,所以这种字体包含的字符比较多,一般都有六万多个,基本包含了Unicode第0平面的字符,常用的文字都可以显示。思源宋体就是Noto字体中的一种。

 

推荐一款软件High-Logic MainType,这个软件可以查看系统中已安装的字体和字体文件中的字符,字体中包含的字符个数。

 

字体显示文字

显示文字需要使用字符的编码到字体文件中找到相应的字符,然后将字符绘制出来。

 

字体中不存在的字符

前面说过字体中包含的字符是有限的,英文字体中可能不包含中文字符,中文字体中不包含日语等等。如果我用一个英文字体去显示中文时,因为字体中不包含中文,会发生什么情况呢?

 

未定义字符,字体文件中一般都包含了一个未定义字符,如果一个字符编码在字体文件中未定义,一般情况编码会映射到未定义字符。未定义字符为字体的第一个符号,编码为0,如下图展示了部分字体中的未定义字符:

这里的截图是通过High-Logic FontCreator软件打开字体,从图片中可以看到未定义字符一般都是一个正方形,也有直接是空白的。

 

当我们用window系统的记事本打开一些非文本文件,如exe、dll,时就可以看到未定义字符,如下图:

 

在一些英文windows系统中,由于没有安装中文字体,显示中文的时候就会显示未定义字符,如下图:

 

避免未定义字符

有些软件可以同时设置两个字体一个中文字体,一个英文字体,从而避免出现未定义字符,如下图时word字体设置对话框:

 

在windows系统中一般很少会看到未定义字符,因为当选择某一字体显示文字时,当系统检测到字体中不包含当前要显示的字符时,会查找系统中其他风格相近的字体中是否包含该字符,如果包含则会用相应的字体显示字符。windows系统会尽量让文字显示正确,避免显示未定义字符。

当然并不是每次自动选择的字体都风格相符,如下只选择Arial英文字体,同时显示中英文:

有些特别糟糕的情况是,windows系统中字体安装不完全系统在自动选择字体时会出现文字的粗细斜体都不一致,如下是一个wpf窗口程序:

解决这种问题最好的办法是选择一个同时包含中英文的字体。

 

这个系列前两文章:

文字显示——字符与编码

C++字符串与字符编码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值