嵌入式Linux系统下的汉字处理和显示由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“嵌入式linux文件系统”。
嵌入式Linux系统下的汉字处理和显示
本文阐述在嵌入式Linux环境下通过汉字编码的转换,汉字字体的提取,实现对汉字的处理和显示。所提出的解决方案,在嵌入式Linux环境下,可以不依赖于MicroWindows、MiniGUI等嵌入式图形界面接口软件实现汉字的处理与显示。1 汉字编码的处理
由于传统的计算机字符内码ASCII码最多只能包含256个字符,只能包含英文字符和其他常用字符,而不能包含其它语言的字符,尤其是汉字。因此不同的组织机构又制定了包含汉字的字符编码标准。GB编码是由我国政府颁布的国家标准,经过不断扩充,形成了GB2312、GB13000(GBK)、GB18030标准;BIG-5码是主要由使用繁体字的地区采用的标准;Unicode编码是由Unicode协会为包含汉字在内的各种语种字符制定的统一字符集标准,同时兼容于国际标准ISO 10646,但是不兼容GB编码。Unicode编码又有UTF8等实现形式,一般Unicode指UCS-2规范。
在嵌入式Linux系统下使用的汉字,其来源大致可以分为: 1.程序字符串常量中的汉字; 2.文本文件或其它资源文件。因为各种源文件编辑器、文本文件编辑器或资源文件来源的不同、网络环境的不同。因此嵌入式Linux系统下使用的汉字也体现为各种不同的编码格式,需要进行编码格式的转换,才能够对汉字进行正确的处理。
嵌入式Linux系统应用开发所使用的程序源文件和文本文件,一般是来自于Windows操作系统下的编辑工具,或Linux桌面操作系统下的编辑工具。Windows操作系统下的常用文本编辑器,如Notepad、UltraEdit等,缺省的文件编码保存格式是ASCII码,其中的汉字以GB编码保存。Linux XWindow下的图形界面文件编辑器gEdit,也以ASCII码作为缺省的文本保存编码,其中的汉字以UTF-8编码保存。
嵌入式Linux系统所使用的程序编译工具,如gcc、g++系列工具,按照ASCII码格式对源文件进行分析和编译,对于字符串常量中的字符,则不加区别,按原有编码格式编译进入目标文件。
Montavista Linux提供了iconv函数族,用于将字符串在各种编码之间进行转换。使用iconv函数族,需要包含iconv.h头文件。Montavista Linux的iconv函数族支持ASCII编码、GB系列编码、BIG-5编码、UNICODE编码、UTF8等编码格式的相互转换。在Linux命令行方式下,可以使用iconv –list命令查看iconv函数族所支持的编码格式列表。
部分程序代码如下:
以下一段代码实现从GB2312编码的字符串sin到UNICODE编码的字符串sout的转换:
/*打开转换句柄*/
if((c_pt = iconv_open(“GB2312”, “UNICODE”))==(iconv_t)(-1))
return-1;
/*进行转换*/
ret = iconv(c_pt, &sin, &lenin, &sout, &lenout);
if(ret ==-1)
return-1;
/*关闭转换句柄*/
iconv_close(c_pt);2 汉字的显示
在嵌入式应用中,经常需要在嵌入式设备的显示屏上进行汉字显示。现在,已经有了各种各样的汉字字体可供计算机应用系统选择,使得汉字的显示呈现出丰富多彩的外观。为了在嵌入式Linux系统中使用这些字体,需要将嵌入式应用所得到的汉字编码转换成为字体文件所需要的索引码,并由索引码提取得到汉字显示图元,转换为指定尺寸的显示位图,在嵌入式显示屏上进行显示。
在程序中操作字体文件,需要根据字体文件的格式实现。通过FreeType 2软件,实现了对于各种字体文件统一的、独立于字体文件类型的API函数,可以方便地得到字体图元、字体信息,实现程序中的字体操作。FreeType 2是遵循GPL条款的开源软件,有占用空间小、可定制的特点,较适合于嵌入式应用。FreeType 2缺省支持TrueType、Type 1 等常见字体格式。
下面以TrueType字体为例,说明字体文件在嵌入式Linux系统下的应用。TrueType是由AppleComputer公司和Microsoft公司联合提出的一种数学字形描述技术。它用数学函数描述字体轮廓外形,采用几何学中二次B样条曲线及直线来描述字体的外形轮廓,由于TrueType以指令对字体进行描述,因此与分辨率无关。无论放大或缩小,字符总是光滑的。目前TrueType字体在Windows操作系统等环境中得到了广泛的使用。
由于TrueType字体文件使用Unicode编码的UCS-2规范进行索引,因此,对于来自源文件字符串常量中的汉字或非Unicode编码UCS-2规范的文本文件、资源文件,或其它汉字字符来源。需要使用上面所述的编码转换方法,将原汉字编码转换为UNICODE的编码格式,再根据得到的UNICODE编码从TrueType字体文件提取得到汉字图元,转换为汉字位图点阵,进行显示。
部分程序代码如下:
以下一段代码实现字体API的初始化,并指定使用TrueType字体文件kaitiGB2312.ttf,使用UNICODE进行索引。
static FT_Library
library;static FT_Face
face;
FT_Init_FreeType(&library);
FT_New_Face(library, “ data/fonts/kaitiGB2312.ttf ”, 0, &face);
FT_Select_Charmap(face, FT_ENCODING_UNICODE);以下一段代码根据UNICODE编码的字符串wtext,逐字检索得到从字体文件中检索得到汉字图元,得到8位灰度象素的位图点阵:
FT_Set_Char_Size(face, font_height
100,100);
for(iCharPos=1;wtext[iCharPos];iCharPos++){
index = FT_Get_Char_Index(face, wtext[iCharPos]);
FT_Load_Glyph(face, index, 0);
/* 如果图元不是位图,则转换为位图点阵 */
if(face->glyph->format!= FT_GLYPH_FORMAT_BITMAP){
FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
}
width = face->glyph->bitmap.width;
height = face->glyph->bitmap.rows;
src = face->glyph->bitmap.buffer;
//在此处理得到的汉字显示位图点阵缓存src。
} 在嵌入式应用程序中,由以上得到的汉字显示位图点阵,按一定颜色、一定位置转换为嵌入式显示设备的显示缓存格式,填入显示缓存,即实现了汉字的显示。
如以下一段代码将汉字显示位图点阵转换为UYVY格式的位图,填写进入显示设备/dev/fb/0的显示缓存:
……
fd = open(“/dev/fb/0”, O_RDWR);
……
/* 得到显示缓存 */
dst =(char *)mmap(NULL,fixInfo.line_length * varInfo.yres_virtual,PROT_READ|PROT_WRITE,MAP_SHARED, fd, 0);
……
/* 初始化格式转换矩阵 */
for(i=0;i
_8to5bit[i] = i *(1
for(i=0;i
_8to6bit[i] = i *(1
/* 按照给定位置x-x_max,y – y_max逐象素转换并填写显示缓存 */
for(i = x, p = 0;i
for(j = y, q = 0;j
if(i >= screenp->w || j >= screenp->h)
continue;
sp = q * width + p;
dp = j * scrp->w + i;
pixel = src[sp] / 255;
dst[dp] |= _8to5bit[pixel] | _8to6bit[pixel]
_8to5bit[pixel]
}
}
嵌入式Linux学习心得1、Linux命令ls:查看目录-l以列表方式查看;ls –l 与ll的功能一样 pwd: 查看当前的目录cd:改变当前操作目录cd /直接跳到根目录 cd ..回到上一级目录 ca......
嵌入式系统 实验报告 闻悦 孙恩比 虞淦超 孙德一 滑冰 2010年1月5日一.选题 我们组的实验题目是:将配制过并且用Open64编译过的linux操作系统移植到ebox中。 这个实验是编......
刀豆文库小编为你整合推荐4篇论文单片机系统中的汉字显示,也许这些就是您需要的文章,但愿刀豆文库能带给您一些学习、工作上的帮助。......
论文单片机系统中的汉字显示摘要:需要显示的汉字较多时,单片机系统中的汉字编码非常繁琐,单片机系统中的汉字显示。本文介绍一种直接利用PC机的汉字内码作为单片机系统的汉字编......
LED显示系统GPRS无线LED信息发布系统方案一、概述由于传统的LED 显示屏的信息输入只能通过数据线与电脑直接连接来进行, 因此对于传统LED显示屏来说不能满足远程信息实时发......