基于嵌入式操作系统的汉字字符混合输出显示的实现方法与流程

文档序号:16929789发布日期:2019-02-22 20:10阅读:430来源:国知局
基于嵌入式操作系统的汉字字符混合输出显示的实现方法与流程
本发明涉及计算机嵌入式软件
技术领域
,具体涉及一种基于嵌入式操作系统的汉字字符混合输出显示的实现方法。
背景技术
:在嵌入式系统中,由于建立了小型的汉字库,程序运行时汉字的显示效率提高,节省开销。然而嵌入式系统中硬件资源有限,其操作系统往往不会为用户提供像windows那样图形化的操作界面。通常其集成开发环境中会提供封装好的图形界面开发函数,比如风河公司的vxworks操作系统中,有windml开发组件,其api函数支持进一步的嵌入式的图形界面开发;linux操作系统也有相关的图形界面开发工具,开发人员获取了相应的开发工具后也可以进一步开发自己的图形显示界面。windml组件库支持基于嵌入式系统的多媒体应用程序,为vxworks提供基本的图形、视频和音频技术。具有较好的软件独立性和可移植性。windml由软件开发包sdk和硬件开发包ddk构成。sdk用来开发应用程序。在图形、输入管理、多媒体、字体和内存管理等方面提供全面的api集合。ddk是位于sdk层和硬件之间的媒介层,为硬件提供了一套完整的驱动和api集。包含的驱动类型如下:图形驱动程序类型包含用来分配颜色的函数指针和变量、执行画图操作、内存分配和页面管理。视频驱动是图形驱动的扩展,它实现了视频开始、停止等视频流操作。字体驱动程序类型包含设置字体模式和大小的函数指针和变量,其结果通过图形驱动程序来显示。输入设备驱动程序包含获得输入信息的函数指针和变量,如键盘、鼠标的驱动程序。以图形驱动api为基础,目前针对vxworks嵌入式操作系统来说,其主要的汉字显示方式是,根据windriver公司提供的windml(windmedialibrary),利用windml对位图字符显示和双字节编码的支持,按照windml位图字体文件的格式完成汉字点阵的转换存储,并使用windml位图字体引擎和渲染函数实现点阵获取、点阵显示,从而将汉字显示出来。windriver公司的vxworks作为性能优秀的嵌入式实时操作系统,不论在可靠性、实时性、可裁减性方面,还是在开放性、易用性等方面都是相当不错的。但windriver公司没有提供汉字显示方案,虽然现在也有很多研究方案,利用windml对位图字符显示和双字节编码的支持,可以完成对汉字的显示,但对字、西文、尤其是汉字、西文、字符混显问题,却没能作更好的支持。而且在不同嵌入式开发模式中,也会有不同的封装好的图形开发组件,但所有的嵌入式系统中封装或支持的图形模块针对汉字的显示都不完善。如何能够更好、更有效地显示汉字,一直都是嵌入式开发人员不断深入研究的课题。而且随着嵌入式技术的不断发展,更好的交互环境对程序设计者也提出更高层次的要求。技术实现要素:(一)要解决的技术问题本发明要解决的技术问题是:如何设计一种基于嵌入式操作系统的汉字字符混合输出的实现方法。(二)技术方案为了解决上述技术问题,本发明提供了一种基于嵌入式操作系统的汉字字符混合输出显示的实现方法,包括以下步骤:第一步:修改字体驱动文件udbmffnt.c,同时要生成中文和字符合一的字体库;第二步:通过用户调用,加载设备驱动、字体引擎;第三步:基于第二步查找及设置字体属性;第四步:基于第一步进行汉字和字符的混显输出。优选地,第一步具体为:修改udbmffnt.c中的uglbmftextdraww()及uglbmftextsizegetw函数,然后生成需要的字体,并形成一个字库,并把字库形成的点阵数据按照windml中点阵字库的结构进行提取,最后形成汉字库适用于windml汉字库文件,并在该文件中加入英文及字符的定义,从而生成一个可以处理汉字及字符的字体驱动以及中文和字符合一的字体库。优选地,第一步中,修改udbmffnt.c中的uglbmftextdraww()及uglbmftextsizegetw函数的方式为:将读入的双字节指针转换为一个单字节指针,之后对读入的文本内容进行解析,程序是对文本的机内码进行处理的,直接取16位汉字的低8位得到该汉字的机内码可以对应的位码,对于汉字来说,其机内码的高低字节都应该大于等于0xa1,小于0xa1的数按照字符或者英文进行处理,大于等于0xa1的数按汉字进行处理,记录数在页表中的位置,对于字符,则处理完后指针右移8位,得到的这个8位数是该汉字的机内码可以对应的区码,处理结束后指针按处理的不同类型指向下一个8位或16位的位置。优选地,第一步中,用汉字库生成工具fontpicker.exe生成需要的字体。优选地,第一步中,生成需要的字体后形成一个16*16的宋体字库。优选地,第二步中加载设备驱动时调用一个结构体,该结构体定义了键盘、鼠标、字体这些设备驱动,在图形界面初始化时,加载设备驱动以及字体引擎。优选地,第二步中,需要加载的设备会在ugl_display_cfg结构体中写好,图形界面初始化时,用户的程序入口调用windml5.3开发组件中的uglinitialize()函数;这样通过读出结构体中的元素获知加载了哪些设备。优选地,第三步中,加载完设备驱动及字体引擎之后,查找及设置字体属性,其中调用windml开发组件中的函数uglfontfindstring()、uglfontcreate()、uglfontset()来设置用户需要的字体类型,大小属性。优选地,第四步中,在用户应用程序中通过调用windml组件中经第一步修改后的uglbmftextdraww()函数来完成对汉字和字符的混和输出。(三)有益效果本发明针对在嵌入式操作系统中显示汉字、西文、尤其是汉字、西文、字符混显问题进行研究,通过建立字符及汉字编码的混合汉字库,并在windml字体驱动层中,添加对单字节、双字节混排的处理,实现了一种基于嵌入式操作系统的汉字字符混合输出显示的实现方法。附图说明图1为字模显示与字模信息的对应关系图;图2为windml中汉字的加载过程图;图3是本发明的汉字字符混合输出显示的实现过程图;图4为本发明中汉字字符混合输出显示实现流程图;图5是本发明中双字节输入的指针处理过程图;图6是本发明的英文数字及图形演示的系统测试界面图;图7是本发明的汉字字符混显的工程效果图。具体实施方式为使本发明的目的、内容、和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。汉字要在计算机内部存储及显示,首先必须按照一定的编码规则进行编码。各种汉字字符集建立的编码方案都是按照国家编码标准制定的,因此,对现有的国家标准及目前国际通用标准简要介绍,以便在此基础上阐述汉字在计算机中的存储及显示原理。目前,汉字主要的字符集有gb2312-80、gbk及gb18030,全称依次是《信息交换用汉字编码字符集基本集》、《汉字编码扩展规范》和《信息技术中文编码字符集》。它们都属于双字节字符集,向下兼容。gb2312-80是国标基本字符集,由中国国家标准总局发布,1981年5月开始实施,通行于中国大陆。新加坡等地也采取此编码。收录了6763个汉字(一级字3755个,二级字3008个);标注基本满足了汉字的计算机处理需要,收录的汉字覆盖了中国大陆99.75%的使用频率,但对于人名、古汉语等方面出现的罕见字和繁体字不能处理。gbk是中华人民共和国信息技术标准化技术委员会1995年制定,收录了20902个汉字;gbk包括了gb2312的所有内容,同时又增加近20000个新的汉字(包括繁体字)和符号。它是包括中日韩字符的大字符集和。向下与gb2312完全兼容,向上支持iso10646国际标准。2000年的gb18030取代了gbk1.0的国家标准,收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,2006年开始实施,是目前最新的汉字编码字符集国家标准。unicode也称为万国码,是统一码联盟为世界上大多数文字系统进行整理和编码后形成的。iso(国际标准化组织)也制定了一个覆盖地球上所有文化、所有字母和符号的编码“universalmultiple—octetcodedcharacterset”。简称ucs。后来这两种字符集在unicode2.0时实质性合并,编码保持基本一致。unicode编码方案中每个编码由两个字节组成,共可表示65536个字符,由于编码空间较大,unicode可以容纳全球所有的语言文字。但是unicode并不能解决全部的文字,也不能解决传输的问题。即,unicode只是符号集,只规定了符号的二进制代码,并没有规定这个二进制代码应该如何存储。因此,unicode用一些基本的保留字符制定了三套编码方式:utf-8、utf-16和utf-32。utf-8保留了ascii字符编码作为它的一部分,字符以8位序列来编码,同样,顾名思义utf-16及utf-32是用16位及32位序列进行编码。在互联网上使用最多的是utf-8方式。目前有很多的研究和算法都可以实现对unicode编码和gb2312编码的双向转换。在计算机中,汉字以机内码的形式存储。同时,由国标gb2312规定国家标准汉字代码体系包括区位码,机内码和区内码存在一定的转换关系,在了解了这种关系的基础上,以点阵字模为例可阐明汉字字模在计算机中的存储方式及其显示的基本原理。计算机内英文字符是用一个字节的ascii码表示,该字节最高位一般用做奇偶校验,故用7位码来代表128个字符。但对于汉字说,只有用两个字节才能代表,这样用两个字节代表一个汉字的代码体制,国家制定了统一标准,称为国标码。国标码规定,组成两字节代码的最高位为0,即每个字节仅只使用7位,这样在机器内使用时,由于英文的ascii码也在使用,可能将国标码看成两个ascii码,因而规定用国标码在机器内表示汉字时,将每个字节的最高位置加1,以显示该码表示的是汉字,这些国标码两字节最高位加1后的代码称为机器内的汉字代码,简称机内码。国标码规定表示汉字的两个字节中第一个字节表示区号,第二个字节表示位号。机内码可以转换为区内码,只要知道了区位码,就可知其在字库中的地址。比如对于显示16×16的汉字“国”来说,其国标码、机内码、区码、位码间的关系及说明如下:国标码:01111010001110机内码:11111010101110机内码对应的双字节数是:0xfab9;区码:区码=机内码高字节–0xa0;对“国”来说即为:0xfa–0xa0;位码:位码=机内码低字节–0xa0;对“国”来说即为:0xb9–0xa0。每个汉字在字库中是以点阵字模形式存储的。常用的点阵有16×16、24×24、32×32等。对于16×16的矩阵来说,它需要的位数:16×16=256个位,每个字节是8位,这样汉字都需要256/8=32个字节来表示。汉字用94×94的区位码表示,汉字被分为94个区和94个位,存放在一张表中。要显示一个汉字时,键盘将汉字输入计算机,管理模块自动将输入的汉字转换为机内码,汉字的机内码可以转换成对应区位码,然后通过区位码在字库中的位置读出汉字点阵数据,计算机系统根据该汉字在库中的偏移地址(首地址)找出对应的字模(字模是用数字的各位信息来记载英文或汉字的形状),然后将字模按行扫描的办法(通过循环)在屏幕上显示出像点,存1的点在屏上显示一个亮点,存0的点则不显示,由此组合成一个汉字实现汉字在屏幕上的显示。例如对于显示16×16的“国”字:汉字字模在字库中的偏移地址(首地址):(94×(区码–1)+(位码–1))×32=(94×(90–1)+(25–1))×32=0x418c0。在该地址处可找到其对应的字模信息,字模与显示的对应关系见图1所示。这个字模信息的定义是按行扫描得到的“国”字的点阵资料,是列递增,把行显示效果排成一个连续的空间,按字节来描述每一位的打点状态。在本发明中,以使用风河公司的windml5.3开发组件为例,来说明在嵌入式操作系统图形界面开发中,字符、汉字、英文的显示及加载过程以及混合输出显示的实现机理。windml5.3提供了比较完善的西文字符解决方案,支持多种英文字体的显示,在用户应用中,使用字体前需要加载及初始化字体引擎,通过字体引擎找到字体的id,再调用uglfontfindstring()来查找配置图形界面中间层时已经配置好的字体,通过uglfontset()函数将该字体加入图形显示上下文,这样就可以具体调用ugltextdraw()等函数具体完成字符的加载及显示了(如图2所示)。当不仅需要显示英文,还需要显示中文,以及要完成中英文混合输出显示时,如何更便捷的完成这个需求是需要研究的问题。在用户使用图形界面开发的过程中,经常需要在同一行输入中既能正确加载中文,又能无缝显示英文及字符,基于该问题,本发明提供的基于嵌入式操作系统的汉字字符混合输出显示的实现方法,包括以下步骤:第一步:修改字体驱动文件udbmffnt.c,同时要生成中文和字符合一的字体库;具体地说就是:修改udbmffnt.c中的uglbmftextdraww()及uglbmftextsizegetw函数;修改这两个函数的思路是:将读入的双字节指针转换为一个单字节指针,之后对读入的文本内容进行解析,程序是对文本的机内码进行处理的,直接取16位汉字的低8位得到该汉字的机内码可以对应的位码,如前原理所讲:区位码的区号=机内码高字节–0xa0、区位码的位号=机内码低字节–0xa0。对于汉字来说,其机内码的高低字节都应该大于等于0xa1,小于0xa1的数按照字符或者英文进行处理,大于等于0xa1的数按汉字进行处理,记录其在页表中的位置,如果是字符,则处理完后指针右移8位,得到的这个8位数是该汉字的机内码可以对应的区码。处理结束后指针按处理的不同类型指向下一个8位或16位的位置。该过程具体见附图4,双字节输入的处理思路见附图5。然后用汉字库生成工具fontpicker.exe,根据需求,生成需要的字体。在这里生成了一个16*16的宋体字库,并把字库形成的点阵数据按照windml中点阵字库的结构进行提取,最后形成汉字库适用于windml汉字库文件,并在该文件中加入英文及字符的定义。按照windml汉字库格式定义添加英文及字符结构体如下:这样就生成了一个可以处理汉字及字符的字体驱动以及中文和字符合一的字体库。第二步:通过用户调用,加载设备驱动、字体引擎加载设备驱动时会调用到一个结构体。该结构体定义了键盘、鼠标、字体等设备驱动,在图形界面初始化时,可以加载设备驱动,字体引擎也在这里定义及加载。加载字符、字体的实现过程如下,以song16字体为例,在windml5.3开发组件中uglinit.c程序文件中:需要加载的设备会在ugl_display_cfg结构体中写好,图形界面初始化时,用户的程序入口会调用windml5.3开发组件中的uglinitialize()函数;这样通过读出结构体中的元素可以获知加载了哪些设备,字体引擎也是通过该渠道加载进系统。这样当我们正确加载了中文字库之后,就可以通过上层调用windml5.3开发组件中的uglfontfindstring(),uglfontcreate(),uglfontset()等函数来实现对汉字的显示。第三步:查找及设置字体属性初始化完成,加载完设备驱动及字体引擎之后,就可以查找及设置字体属性了。在这里可以根据用户实际需要调用windml开发组件中的函数uglfontfindstring()、uglfontcreate()、uglfontset()来设置用户实际需要的字体类型,大小等属性。第四步,汉字和字符的混显输出最后在用户应用程序中通过调用windml组件中经第一步修改后的uglbmftextdraww()函数来完成对汉字和字符的混和输出。在某工程实践中,使用某国产化嵌入式操作系统,以loogson3a处理器主板为平台,以windml5.3为依托,加载并实现了适用于国产化嵌入式操作系统的图形界面的开发及演示,支持高分辨率显示,支持键盘鼠标等外设,支持网络等设备驱动,支持多核、多线程、多任务机制,在英文、数字图形等显示的同时较好的完成了系统匹配,见图6,图7为某武器系统开机自检测试过程中,汉字字符混显的工程效果图。以上所述仅是本发明的优选实施方式,应当指出,对于本
技术领域
的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1