摘要:LCD是嵌入式常见设备,如何在LCD上显示汉字和英文?矢量字体和点阵字体有何不同?同一个字符为何有多种编码?GB2312、GB18030指什么?他们之间有关系吗?嵌入式设备如何支持多国语言?从哪里获取字库?需要付费吗?以上问题,本文一一道来!
在LCD上如何显示字符呢?这里我们讨论的是逻辑问题,不是LCD控制器驱动。
首先,我们要对LCD有一个概念:LCD也就是一个点一个点组成的一片点而已。本质上和1个LED一样。
1个单色LED,能显示亮灭。
将很对LED排成一行,就可以实现流水灯。
将多行LED组成一片,是啥?是LED点阵。
多块点阵,就能组成图文屏。
如果是三色LED组成的图文屏,就能显示视频动画。
无论是COG LCD
,OLED LCD
,还是TFT LCD
,实际上都是一个点一个点组成的矩阵,和LED组成的图文屏一样。
当然,制造工艺不一样,控制显示内容技术也不一样,我们不讨论制造技术,控制技术后续会有单独课程讨论。
显然,要在图文屏上显示字符,只需将对应的LED点点亮。不同的字符应该点亮那些LED呢?
我们先逆向想,下图LED点阵上显示的汉字,如何将位置信息保存到代码中,以便下次使用?
这是一个16x16的LED点阵。
每个LED的状态仅仅是亮或灭,那么就可以使用1个bit表示其状态,1表示亮,0表示灭。
1个byte,8个bit,两个byte就可以表示一行LED的状态。
上图这个德字第一行就可以这样表示:0001 0000 0100 0000;也就是0x10,0x40;
按照此方法取得“德”字得完整显示信息:
用1个数组保存,如下:
de_dot[32]={
0x10, 0x40, 0x10, 0x40,0x2f, 0xfe, 0x40, 0x40,
0x97, 0xfc, 0x14, 0xa4,0x24, 0xa4,0x67, 0xfc,
0xa0, 0x00,0x2f, 0xfe,0x20, 0x40,0x20, 0x24,
0x25, 0x22, 0x25, 0x05, 0x29, 0x08, 0x20, 0xf8};
得到了这个数组,在代码中按照取模的方式将其还原到LED点阵上,就能显示德字。
玩过8段数码管的朋友应该很熟悉,为了在数码管上显示数字,我们会在代码中定义0~9数字的显示掩码(数码管每个段亮灭的信息)。 点阵上显示汉字,无非就是LED更多了。
因此,要在LCD上显示字符,需要先知道如何描绘字符的信息,按照取模方式,将这写信息还原到LCD上,就能描绘出字符。
那什么是点阵字库呢?
上面说的“德”字的描绘信息数组就是点阵字库。
这个德字描绘出的效果,就是点阵字体。描绘信息保存的形式,就是点阵字库。
点阵字库有多种形式:
取模方式指的是单个bit位置信息组合成字节时使用的方式。
前面我们对德字取位置信息时:使用横向取模,并且高位在前。此外还有很多不同的取模方式,常见的方式如下:
汉字通常有这些尺寸:12x12,16x16,24x24
。在cog屏128*64像素的屏上,一般用12x12的汉字点阵,可以显示5行。
ASCII码的点阵通常和汉字高度一样,宽度是一半,比如,12x12的汉字配12x6的ASCII码,16x16的汉字配16x8的ASCII码。
矢量字体:矢量字体(Vector font)中每一个字形是通过数学曲线来描述的,它包含了字形边界上的关键点,连线的导数信息等,字体的渲染引擎通过读取这些数学矢量,然后进行一定的数学运算来进行渲染。这类字体的优点是字体实际尺寸可以任意缩放而不变形、变色。矢量字体主要包括 Type1 、 TrueType、OpenType等几类。
Freetype:FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。
字符编码是指一种映射规则,根据这个映射规则可以将某个字符映射成其他形式的数据以便在计算机中存储和传输。
ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符 。
欧美很多国家的语言在ASCII码中没有定义,各个国家(或组织)就使用1个字节剩下的127个值映射他们需要的字符。
国家很多,定义很多,如何决定使用哪种映射呢?
IBM、微软等系统就增加了CodePage的概念:每种映射分配一个编号。这些系统的代码页编号是不完全一样的。IBM定义的代码叫做OEM,微软定义的代码叫ANSI。
汉字字符数量很多,仅仅使用高位127个值不能表示。
因此国家标准组织定义了《信息交换用汉字编码字符集》。有三个版本:
GB2312编码:1981年5月1日发布的简体中文汉字编码国家标准。GB2312对汉字采用双字节编码,收录7445个图形字符,其中包括6763个汉字。
GBK编码:1995年12月发布的汉字编码国家标准,是对GB2312编码的扩充,对汉字采用双字节编码。GBK字符集共收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。
GB18030编码:2000年3月17日发布的汉字编码国家标准,是对GBK编码的扩充,覆盖中文、日文、朝鲜语和中国少数民族文字,其中收录27484个汉字。GB18030字符集采用单字节、双字节和四字节三种方式对字符编码。兼容GBK和GB2312字符集。
汉字编码使用分区概念,如下面分区,其中的双字节二区就是符合GB2312标准的双字节区。
双字节部分编码空间结构图
在介绍如何获得字库之前,先说明版权问题
在你的电脑中就有很多字体。windows
下的C:\Windows\Fonts
下保存有你电脑安装的字体,这种字体通常是ttf标准。
这些字体一般都不是开源的,也就是不能免费商用到嵌入式设备上。开源的字体有:思源字体,可以免费商用。
我们更关心的是如何获取点阵字体。
前面说过,点阵字体有很多存在方式,那么我们就有很多获取方式。
来源 | 屋脊雀 http://www.wujique.com/
本文来源网络,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。