良许Linux教程网 干货合集 嵌入式的汉字原来是这样显示的?

嵌入式的汉字原来是这样显示的?

摘要:在嵌入式系统中,LCD是一种常见的设备。本文将介绍如何在LCD上显示汉字和英文字符,并讨论矢量字体和点阵字体的区别。此外,我们还将探讨为何同一个字符有多种编码,以及GB2312和GB18030的含义以及它们之间的关系。最后,我们将讨论嵌入式设备如何支持多国语言,并提供获取字库的方式和是否需要付费。

一、在LCD上显示字符

要在LCD上显示字符,首先需要理解LCD的基本概念,这里我们主要讨论逻辑问题,而非LCD控制器驱动。

首先,需要明确LCD是由许多个点组成的。从本质上来说,它类似于由许多个独立的LED灯组成的一片区域。

  • 如果只有一个单色LED,它可以显示亮和灭的状态。
  • 将多个LED排列成一行,就可以实现流水灯效果。
  • 当多行LED组合在一起时,就形成了LED点阵。
  • 当多个LED点阵组合在一起时,就构成了图文屏幕。
  • 如果是由三色LED组成的图文屏幕,就可以显示视频动画效果。
image-20240122204919537
image-20240122204919537
image-20240122204922179
image-20240122204922179

无论是COG LCDOLED LCD,还是TFT LCD,实际上都是一个点一个点组成的矩阵,和LED组成的图文屏一样。

当然,制造工艺不一样,控制显示内容技术也不一样,我们不讨论制造技术,控制技术后续会有单独课程讨论。

显然,要在图文屏上显示字符,只需将对应的LED点点亮。不同的字符应该点亮那些LED呢?

我们先逆向想,下图LED点阵上显示的汉字,如何将位置信息保存到代码中,以便下次使用?

image-20240122204925063
image-20240122204925063

这是一个16×16的LED点阵。

每个LED的状态仅仅是亮或灭,那么就可以使用1个bit表示其状态,1表示亮,0表示灭。

1个byte,8个bit,两个byte就可以表示一行LED的状态。

上图这个德字第一行就可以这样表示:0001 0000 0100 0000;也就是0x10,0x40;

按照此方法取得“德”字得完整显示信息:

  • 0001 0000 0100 0000 0x10 0x40
  • 0001 0000 0100 0000 0x10 0x40
  • 0010 1111 1111 1110 0x2F 0xFE
  • 0100 0000 0100 0000 0x40 0x40
  • 1001 0111 1111 1100 0x97 0xFC
  • 0001 0100 1010 0100 0x14 0xA4
  • 0010 0100 1010 0100 0x24 0xA4
  • 0110 0111 1111 1100 0x67 0xFC
  • 1010 0000 0000 0000 0xA0 0x00
  • 0010 1111 1111 1110 0x2F 0xFE
  • 0010 0000 0100 0000 0x20 0x40
  • 0010 0000 0010 0100 0x20 0x24
  • 0010 0101 0010 0010 0x25 0x22
  • 0010 0101 0000 1010 0x25 0x05
  • 0010 1001 0000 1000 0x29 0x08
  • 0010 0000 1111 1000 0x20 0xF8

用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上,就能描绘出字符。

二、点阵字库

那什么是点阵字库呢?

上面说的“”字的描绘信息数组就是点阵字库。

这个德字描绘出的效果,就是点阵字体。描绘信息保存的形式,就是点阵字库

图片
图片

点阵字库有多种形式:

  • 1、直接将信息用数组保存到代码中。(显示的内容较少时通常会这样做)
  • 2、将点阵信息描绘到一张bmp图片,使用时根据信息文件(FNT)从图片中取信息。(很多游戏使用的就是这种贴图字体,也叫bmpfont)
  • 3、将一堆点阵信息数组打包为1个bin文件,使用算法定位字符位置。(点阵较多,按照编码规范整合在一起)
  • 4、按照电脑字体规范整合的字体。(比如windows的ttf字体,bdf字体)

三、取模方式

取模方式指的是单个bit位置信息组合成字节时使用的方式。

前面我们对德字取位置信息时:使用横向取模,并且高位在前。此外还有很多不同的取模方式,常见的方式如下:

image-20240122204929195
image-20240122204929195

尺寸

汉字通常有这些尺寸:12x12,16x16,24x24。在cog屏128*64像素的屏上,一般用12×12的汉字点阵,可以显示5行。

ASCII码的点阵通常和汉字高度一样,宽度是一半,比如,12×12的汉字配12×6的ASCII码,16×16的汉字配16×8的ASCII码。

四、矢量字体

矢量字体:矢量字体(Vector font)中每一个字形是通过数学曲线来描述的,它包含了字形边界上的关键点,连线的导数信息等,字体的渲染引擎通过读取这些数学矢量,然后进行一定的数学运算来进行渲染。这类字体的优点是字体实际尺寸可以任意缩放而不变形、变色。矢量字体主要包括 Type1 、 TrueType、OpenType等几类。

Freetype:FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件,包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。

  • 矢量字体使用Freetype进行渲染后,最后得到的也是bitmap,毕竟,LCD就是一个一个点组成的。
  • 理论上矢量字体可以无限放大而不失真。
  • 但是,矢量字体渲染为较小字号的字,某些字(笔画多)可能失真非常严重。

五、字符编码

字符编码是指一种映射规则,根据这个映射规则可以将某个字符映射成其他形式的数据以便在计算机中存储和传输。

image-20240122204933626
image-20240122204933626

ASCII码

ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符 。

Codepage

欧美很多国家的语言在ASCII码中没有定义,各个国家(或组织)就使用1个字节剩下的127个值映射他们需要的字符。

国家很多,定义很多,如何决定使用哪种映射呢?

IBM、微软等系统就增加了CodePage的概念:每种映射分配一个编号。这些系统的代码页编号是不完全一样的。IBM定义的代码叫做OEM,微软定义的代码叫ANSI。

640
640

六、汉字编码

汉字字符数量很多,仅仅使用高位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标准的双字节区。

image-20240122205002636
image-20240122205002636

双字节部分编码空间结构图

七、如何获得字库

在介绍如何获得字库之前,先说明版权问题

  • 版权说的是字体,也就是一个字符描绘出来的效果。一个字体的形成方式通常是矢量字体或者点阵字库。
  • 使用工具将一种字体的矢量字库转换为点阵字库,他们仍然是同一种字体,那么版权是一样的,依然属于矢量字体拥有者。

获取矢量字体

在你的电脑中就有很多字体。windows下的C:\Windows\Fonts下保存有你电脑安装的字体,这种字体通常是ttf标准。

这些字体一般都不是开源的,也就是不能免费商用到嵌入式设备上。开源的字体有:思源字体,可以免费商用。

image-20240122205006154
image-20240122205006154

八、获取点阵字体

我们更关心的是如何获取点阵字体。

前面说过,点阵字体有很多存在方式,那么我们就有很多获取方式。

  1. 从很早之前的电脑汉卡上获取点阵字库。这种方式比较难找,在github上可以找到一些外文的点阵字库,汉字的没找到。
  2. 从DOS系统获取汉字点阵这种点阵我用过的有HZ1616,HZ1212。这种字体的版权不是很清楚属于谁。不过这种字库因为很早,所以基本都是GB2312规范的,不包含生僻字。
  3. 从电脑字体中找点阵字体电脑字体常见的是TTF规范,这个规范比代表它只有矢量字体,很多电脑字体中会包含矢量字体和点阵字体。点阵字体一般是小号字。小号字用矢量字体渲染,效果不好,所有某种字体通常会带小号的点阵字体。
  4. 取模工具取点阵信息 如果使用的字符很少,可以用《zimo3》等工具取模。
  5. 点阵生成工具批量生成 比如易木雨软件工作室做的《字库制作软件.rar》,可以批量将矢量字库转为点阵字库。
  6. 开源模块中找外文点阵 比如tslib触摸库中就含有英文点阵
  7. 。有一个叫高通的公司,卖点阵字库芯片。有一个较北京中易的公司,有一套很好的点阵字库。这套点阵字库由于性能好,流传广,工作经验丰富的工程师一般都接触过;不过大部分公司可能都没有获得授权。还有其他很多做字体的公司也有点阵字库,比如方正。
  8. 自己用编辑工具一个一个画,然后用你的脑子将其转为数组。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部