发明内容
本发明主要解决的技术问题是提供一种嵌入式设备及其在OSD界面显示语言文字的方法,能够高效、方便、低成本地实现在嵌入式设备的OSD界面进行各种语言文字显示功能。
为解决上述技术问题,本发明采用的一个技术方案是:提供一种在嵌入式设备OSD界面显示语言文字的方法,包括:读取待显示的统一码UNICODE编码格式的字符数据;根据所述字符数据的UNICODE编码值判断所述字符数据所在的字库;将所述字符数据的UNICODE编码值和其所在字库中的字符数据UNICODE编码向量表中的UNICODE编码逐一比较,得到所述字符在UNICODE编码向量表中对应UNICODE编码值的索引值;通过所述索引值进行地址运算,得到对应的字符点阵数据偏移地址;通过所述偏移地址找到字符的点阵数据、实际宽度和高度数据;调用OSD显示函数以根据所述字符的点阵数据、宽度和高度数据显示字符。
其中,所述将字符数据的UNICODE编码值和其所在字库中的字符数据UNICODE编码向量表中的UNICODE编码逐一比较的步骤包括:将所述字符数据的UNICODE编码值和其所在字库中的字符数据UNICODE编码向量表中的UNICODE编码通过二分法逐一比较。
其中,在所述读取待显示的字符数据步骤之后、判断所述字符数据的编码是否为统一码UNICODE编码步骤之前,包括:判断输入的字符数据所对应的字符串是否为有效的统一码文本格式(UTF)字符串;在所对应的字符串为有效的UTF字符串时,将所述UTF字符串转换成UNICODE编码格式的字符串;在转换成UNICODE编码格式的字符串后,得到所述字符串的前两个字节,合并所述两个字节的数值得到字符UNICODE编码值。
其中,所述在转换成UNICODE编码格式的字符串后、得到所述字符串的前两个字节、合并所述两个字节的数值得到字符UNICODE编码值步骤包括:在转换成UNICODE编码格式的字符串后,将字符指针指向所述字符串的第一个字符,其中在字符串的末尾设0x0000以指示字符串末尾;通过所述字符指针得到字符串的前两个字节;合并所述两个字节的数值得到第一个字符的UNICODE编码值;判断得到的UNICODE编码值是否为0x0000,在是0x0000时判定当前字符指针已指向至字符串的末尾,直接进入判断所述字符数据的编码是否为统一码UNICODE编码步骤。
为解决上述技术问题,本发明采用的另一个技术方案是:提供一种嵌入式设备,包括:字符数据读取单元,用于读取待显示的统一码UNICODE编码格式的字符数据;字符字库判断单元,用于根据所述字符数据的UNICODE编码值判断所述字符数据所在的字库;索引值获取单元,用于将所述字符数据的UNICODE编码值和其所在字库中的字符数据UNICODE编码向量表中的UNICODE编码逐一比较,得到所述字符在UNICODE编码向量表中对应UNICODE编码值的索引值;偏移地址获取单元,用于通过所述索引值进行地址运算,得到对应的字符点阵数据偏移地址;点阵数据获取单元,用于通过所述偏移地址找到字符的点阵数据、实际宽度和高度数据;字符显示单元,用于调用OSD显示函数以根据所述字符的点阵数据、宽度和高度数据显示字符。
其中,包括:UTF码判断单元,用于在所述读取待显示的统一码UNICODE编码格式的字符数据步骤之后、判断所述字符数据所在的字库步骤之前,判断输入的字符数据所对应的字符串是否为有效的统一码文本格式UTF字符串;编码转换单元,用于在所对应的字符串为有效的统一码文本格式UTF字符串时,将所述UTF字符串转换成UNICODE编码格式的字符串;字节合并单元,用于在转换成UNICODE编码格式的字符串后,得到所述字符串的前两个字节,合并所述两个字节的数值得到字符UNICODE编码值。
其中,包括:多语言字符串表生成单元,用于将每一种语言的字符串都生成各自独立的多语言字符串数据表,其中使用UTF-8编码作为字符串中每个字符的编码,数据表由字符串向量和字符串的UTF-8编码数据组成,所述字符串向量用于提供每个字符串数据的存放相对偏移地址,所述UTF-8编码数据用于存放每一个字符串转换成UTF-8编码后的字符数据。
其中,包括:位图文件生成单元,用于从Windows操作系统自带的矢量字库文件中提取指定大小的字体,并将该字体以位图的格式存放得到字符的位图文件;多语言字库生成单元,用于将所述位图文件转换成字库的C语言头文件,使所述C语言头文件中字符的内部数据结构包括所述字符数据UNICODE编码向量表、字符宽度向量表以及字符点阵数据向量表,并且使字库中每个字符的UNICODE编码向量表、字符宽度向量表和字符点阵数据向量表中的顺序一致。
其中,所述嵌入式设备是机顶盒。
本发明的有益效果是:区别于现有技术机顶盒为实现OSD显示字符而浪费大量存储空间或者牺牲字库的通用性和标准化的情况,本发明不但吸收传统的多语言显示方法中具有的点阵字库显示速度快、使用简单的优点,同时利用UNICODE编码的唯一性,即因为Unicode使用0到65535的双字节无符号数对每一个字符进行编码,每一个双字节无符号数字表示至少在一种世界语言中使用的一个唯一字符,本发明正是利用上述UNICODE编码的唯一性,方便快速地查找要显示的字符,不需要为嵌入式设备显示字符而浪费大量的程序的存储空间,不需要为同一种语言做多个字库,而且达到字库的通用性和标准化,字符显示效率较高,无需增太多的软件设计和维护工作。
同时又因为本发明使用了UTF这一在互联网上使用最广的一种国际通用的字符编码的方式,使得嵌入式设备如数字电视机顶盒等在理论上能够同时支持所有的多语言字符的显示,同时消耗的系统资源较少,具备速度快、使用灵活、代码编码量小、代码容易维护和移植等优点。
具体实施方式
基于目前数字机顶盒中要求显示的多国语言的种类越来越多、涉及的语言的语系也越来越多、使用传统的多语言显示技术的话会有很多问题。比如同一个二进制数字可以被解释成不同的符号。在电脑操作系统中,要想打开一个文本文件,就必须预先知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。机顶盒等嵌入式设备中同样存在这个问题。本发明基于上述要想解决的问题,使用一种统一的编码方式:即统一码文本格式UTF,UTF就是目前在互联网上使用最广泛的一种统一的编码的实现方式,本发明致力于将全球所有语言纳入一个统一的编码,并结合以下实施例来详细说明。
参阅图1,本发明在嵌入式设备OSD界面显示语言文字的方法实施例包括以下步骤:
步骤101:读取待显示的统一码UNICODE编码格式的字符数据;
在OSD界面显示语言文字时,嵌入式设备读取保存好的待显示统一码UNICODE编码格式的字符数据,可以是字符串,也可以是一个字符;
步骤102:根据所述字符数据的UNICODE编码值判断所述字符数据所在的字库;
比如存在多个字库,对应不同语系的,可以根据所述字符数据的UNICODE编码值判断所述字符数据所在的字库;
步骤103:将所述字符数据的UNICODE编码值和其所在字库中的字符数据UNICODE编码向量表中的UNICODE编码逐一比较,得到所述字符在UNICODE编码向量表中对应UNICODE编码值的索引值;
每个字库中都包括指向字符地址的字符数据UNICODE编码向量表,即在字库中预先设计指向字符地址的字符数据UNICODE编码向量表,所字符数据UNICODE编码向量表作为字符UNICODE编码与字符点阵数据之间的连接桥梁;
作为字符UNICODE编码与字符点阵数据之间的连接桥梁,所述点阵数据信息中指向字符地址的字符数据UNICODE编码向量表,是在嵌入式设备中预先定义的点阵字库的内部数据结构的一部分,使得很方便地通过字符UNICODE编码找到字符在字库中的宽度和字符点阵数据;
步骤104:通过所述索引值进行地址运算,得到对应的字符点阵数据偏移地址;
步骤105:通过所述偏移地址找到字符的点阵数据、实际宽度和高度数据;
步骤106:调用OSD显示函数以根据所述字符的点阵数据、宽度和高度数据显示字符。
本发明不但吸收传统的多语言显示方法中具有的点阵字库显示速度快、使用简单的优点,同时利用UNICODE编码的唯一性,即因为Unicode使用0到65535的双字节无符号数对每一个字符进行编码,每一个双字节无符号数字表示至少在一种世界语言中使用的一个唯一字符,本发明正是利用上述UNICODE编码的唯一性,方便快速地查找要显示的字符,不需要为嵌入式设备显示字符而浪费大量的程序的存储空间,不需要为同一种语言做多个字库,而且达到字库的通用性和标准化,字符显示效率较高,无需增太多的软件设计和维护工作。
在另一实施例中,所述将字符数据的UNICODE编码值和其所在字库中的字符数据UNICODE编码向量表中的UNICODE编码逐一比较的步骤包括:将所述字符数据的UNICODE编码值和其所在字库中的字符数据UNICODE编码向量表中的UNICODE编码通过二分法逐一比较。
根据点阵数据信息中指向字符地址的字符数据UNICODE编码向量表、ID值、UNICODE编码值和点阵数据信息,可以从所述字库中找到字符数据对应的字符宽度和点阵数据信息。
在另一实施例中,基于上述多个字库实施例的基础上,所述将字符数据的UNICODE编码值和其所在字库中的字符数据UNICODE编码向量表中的UNICODE编码逐一比较的步骤包括:
根据所述字库ID值和字符数据的UNICODE编码值,通过二分法查找到对应字符在所述字库中的索引值。
在另一实施例中,为实现字符串显示,在所述读取待显示的字符数据步骤之后、判断所述字符数据的编码是否为统一码UNICODE编码步骤之前,包括:
1)判断输入的字符数据所对应的字符串是否为有效的统一码文本格式UTF字符串;
所述UTF可以是UTF-8,也可以是UTF-16;
2)在所对应的字符串为有效的统一码文本格式UTF字符串时,将所述UTF字符串转换成UNICODE编码格式的字符串;
3)在转换成UNICODE编码格式的字符串后,得到所述字符串的前两个字节,合并所述两个字节的数值得到字符UNICODE编码值。
其中,基于上述字符串显示实施例的基础上,所述在转换成UNICODE编码格式的字符串后、得到所述字符串的前两个字节、合并所述两个字节的数值得到字符UNICODE编码值步骤包括:
1)在转换成UNICODE编码格式的字符串后,将字符指针指向所述字符串的第一个字符,其中在字符串的末尾设0x0000以指示字符串末尾;
2)通过所述字符指针得到字符串的前两个字节;
3)合并所述两个字节的数值得到第一个字符的UNICODE编码值;
4)判断得到的UNICODE编码值是否为0x0000,在是0x0000时判定当前字符指针已指向至字符串的末尾,直接进入判断所述字符数据的编码是否为统一码UNICODE编码步骤。
这里,是预先在字符串的末尾设置0x0000,以表示结束。
下面举一应用实施例来说明本发明方法,其中包括:
1)多语言字库的制作工具;
2)多语言点阵字库的内部数据格式;
3)多语言字符串数据格式;
4)多语言字符串数据的生成工具;
5)GUI系统调用多语言字库和显示多语言字符串的一套接口函数。
其中:
1)多语言字库的制作工具
多语言字库的制作包括两个步骤,每个步骤分别需要使用不同的工具,最终生成字库的C语言头文件。
步骤一:使用font2bitmap.exe生成字库中字符的位图文件。它可以根据用户设定的字体,字符宽度,高度等属性,从Windows操作系统中自带的矢量字库文件中提取指定大小的字体,并将该字体以位图的格式存放,为制作字库做准备。
步骤二:使用generateFontData.exe将步骤一所生成的字符的位图文件转换成字库的C语言头文件。
2)多语言点阵字库的内部数据格式
点阵字库的内部数据结构为:
typedef struct
{
unsigned char Font_Height;//字库中字符的高度
unsigned short Font_Count;//字库中字符的个数
const unsigned char *Font_Width;//字库中字符宽度向量表
const unsigned int *Font_Data;//字库中字符点阵数据向量表
const unsigned short *Font_Tab;//字库中字符数据UNICODE编码向量
表
}sky_font_t;
和现有多语言字库字符的数据结构说不同的地方是,本发明在此实施例中使用字符数据UNICODE编码向量表。而且字库中每个字符的UNICODE编码向量表、字符宽度向量表和字符点阵数据向量表中的顺序是一致的,这样就很方便地在代码中通过字符UNICODE编码找到字符在字库中的宽度和字符点阵数据。
其中在字库中使用UNICODE编码的原因是:因为Unicode使用0到65535的双字节无符号数对每一个字符进行编码。每一个双字节无符号数字表示至少在一种世界语言中使用的一个唯一字符。本发明实施例正是利用UNICODE编码的唯一性,方便快速地查找要显示的字符,而且UNICODE编码和UTF-8编码之间转换非常容易。
3)多语言字符串数据格式
本发明在此实施例中使用UTF-8编码作为字符串中每个字符的编码,每一种语言的字符串都通过工具生成各自独立的多语言字符串数据表。数据表由字符串向量和字符串的UTF-8编码数据组成。这里所述的字符串向量用于提供每个字符串数据的存放相对偏移地址。所述的UTF-8编码字符数据用于存放每一个字符串转换成UTF-8编码后的字符数据。
以下是多语言字符串数据表的示例和格式说明:
表一:转换前原始的字符串数据示例:
下面是转换后的字符串数据示例(以英文为例):
const unsigned char English_strs_array[]=
{
2,
0x00,0x06,//字符串数目
0x00,0x11,//第一个字符串偏移地址
0x00,0x19,//第二个字符串偏移地址
0x00,0x1e,//第三个字符串偏移地址
0x00,0x23,//第四个字符串偏移地址
0x00,0x29,//第五个字符串偏移地址
0x00,0x34,//第六个字符串偏移地址
0x00,0x3b,//字符串数组的大小
//字符串中每个字符的UTF-8编码的数据,每个字符串以0x00作为结束的标识
0x45,0x6e,0x67,0x6x,0x69,0x73,0x68,0x00,0x4c,0x65,0x66,0x74,0x00,0x4d,0x6f,0x6e,
0x6f,0x00,0x52,0x69,0x67,0x68,0x74,0x00,0x41,0x75,0x64,0x69,0x6f,0x20,0x4d,0x6f,
0x64,0x65,0x00,0x53,0x74,0x65,0x72,0x65,0x6f,0x00,
};
表二:字符串数据表格式说明:
4)多语言字符串数据的生成工具
如上所述,是通过工具将每一种语言的字符串数据转换成UTF-8编码格式。以下是通过工具生成多语言字符串数据的步骤:
步骤一、将多语言字符串输入到一个Excel文件。添加、修改、删除字符串都通过修改Excel文件完成。Excel表格中的第一列是每个字符串的索引ID列表,其它列是每一种语言的名称和翻译的字符串。
表三:多语言字符串Excel表格格式示例:
id |
German |
Indonesian |
French |
RS_LANGUAGE_CODE |
Deutsch |
Indonesian |
Francais |
RS_AC3_MODE |
AC3 Mode |
Mode AC3 |
Mode AC3 |
RS_APPEND |
Spurweg |
Bubuh |
Ajouter |
RS_AUDIO_MODE_left_CHANNEL |
Links |
Kiri |
Gauche |
RS_AUDIO_MODE_MONO |
Mono-Tonspur |
Mono |
Mono |
步骤二、将包含多语言的Excel文件打开并另存为UNICODE编码格式的文本文件。文本文件中的字符串可以不需要带双引号,字符与字符之间用Tab键制表符隔开而不用空格隔开。
步骤三、通过工具TextEncoder.exe将步骤二生成的文本文件(如String.txt)转换成UTF-8编码的字符串数据的头文件和字符串索引ID文件。生成的文件包括str_xxx.h和string.id,这里xxx表示语言的名称。如表格示例,我们将生成str_German.h、str_Indonesian.h、str_French.h和string.id四个文件。
5)GUI系统调用多语言字库并显示多语言字符串的接口函数
在实现多语言用户界面显示上,本方法是通过调用GUI中的DrawText(char*pUTF8String)函数实现的。该实现过程请参见流程图2:
程序执行开始,首先进入步骤S1,该步骤主要是判断输入的字符串pUTF8String是否为有效的UTF-8字符串。如果为有效的UTF-8字符串,则进入步骤S2中,该步骤将UTF-8编码格式字符串转换成UNICODE编码格式的字符串。如果转换成功,则进入步骤S3中,字符指针指向第一个字符,通过字符指针得到字符串的前两个字节,两个字节合并后的数值则为第一个字符的UNICODE编码值。然后进入步骤S4中,判断得到的UNICODE编码值是否为0x0000,如果结果为“是”的话,则表示当前字符指针指向了字符串的末尾,即显示程序结束。如果结果为“否”,则执行下一个步骤S5,该步骤根据每个要显示的字符UNICODE编码值,判断该字符所在的字库,并得到所在字库的ID值,例如,希腊语的UNICODE的范围从0x0370到0x03FF,如果要显示字符串中的字符的UNICODE值落在0x0370到0x03FF,则可以判断该字符为希腊文字符,这样代码就可以去读取希腊语的字库并得到希腊语字符的宽度和点阵数据信息。接下来是步骤S6中,该步骤结合要显示的多语言的字符所在的字库ID和字符的UNICODE编码值,通过二分法查找到该字符在所在字库中的索引值,通过该索引值,就可以进行地址运算,计算出字符点阵数据的偏移地址。再通过该地址可以得到字符的点阵数据了,接下来进入步骤S7,该步骤主要是调用OSD显示函数,将该字符显示处理出来。最后步骤S8,字符指针加2又指向下一个字符的UNICODE数值,并返回步骤S2,重复各步,直到指针指向字符串的结尾。
1)、
字符的UNICODE编码为0x03ab。刚好落在希腊文字的UNICODE范围0x0370-0x03FF之间,,可以判定该字符为希腊文字字符。
2)、通过字符的UNICODE编码值,使用二分法查找字符在希腊语字库中的索引值。以下是查找的算法的代码,其中参数uAimCode为要查找字符的UNICODE编码值,在这个例子中即为0x03ab。pTabUnicode指针指向的是字库中的字符数据UNICODE编码向量表,该编码表中字符的顺序和字符点阵数据表中顺序一致。
BOOL Font_Search(unsigned short uStart,unsigned short uEnd,
unsigned short uAimCode,unsigned short*pTabUnicode,unsigned short
*uIdx)
{
unsigned short start,end,len;
unsigned short midValue;
for(start=uStart,end=uEnd;start<=end;)
{
midValue=pTabUnicode[(start+end+1)/2];
if((start==end)&&(uAimCode!=midValue))
{
*uIdx=0;
return FALSE;
}
if(uAimCode>midValue)
{
start=(end+start+1)/2;
}
else if(uAimCode<midValue)
{
end=(end+start)/2;
}
else
{
*uIdx=(start+end+1)/2;//成功,返回索引值
return TRUE;
}
}
*uIdx=0;
return FALSE;
}
3)、通过索引值,得到字符在点整数据中的偏移地址,从而计算得到点阵数据。
4)、通过底层OSD的显示函数把得到的点阵数据在终端上显示出来,因为目前OSD显示接口主要通过画点函数实现字符的显示,为了加快字符的显示效率和速度,该功能主要通过硬件加速来实现的,把字符点阵数据写到OSD缓存后,才通知系统CPU将点阵数据通过硬件拷贝到视频编码器中,对字符给予显示。
参阅图3,基于本发明精神,还提供一种嵌入式设备实施例,包括:
字符数据读取单元,用于读取待显示的统一码UNICODE编码格式的字符数据;
字符字库判断单元,用于根据所述字符数据的UNICODE编码值判断所述字符数据所在的字库;
索引值获取单元,用于将所述字符数据的UNICODE编码值和其所在字库中的字符数据UNICODE编码向量表中的UNICODE编码逐一比较,得到所述字符在UNICODE编码向量表中对应UNICODE编码值的索引值;
偏移地址获取单元,用于通过所述索引值进行地址运算,得到对应的字符点阵数据偏移地址;
点阵数据获取单元,用于通过所述偏移地址找到字符的点阵数据、实际宽度和高度数据;
字符显示单元,用于调用OSD显示函数以根据所述字符的点阵数据、宽度和高度数据显示字符。
上述实施例是利用UNICODE编码的唯一性,方便快速地查找要显示的字符,不需要为嵌入式设备显示字符而浪费大量的程序的存储空间,不需要为同一种语言做多个字库,而且达到字库的通用性和标准化,字符显示效率较高,无需增太多的软件设计和维护工作。
参阅图4,在进一步的实施例中,为实现字符串显示,所述嵌入式设备还包括:
UTF码判断单元,用于在所述读取待显示的统一码UNICODE编码格式的字符数据步骤之后、判断所述字符数据所在的字库步骤之前,判断输入的字符数据所对应的字符串是否为有效的统一码文本格式UTF字符串;
编码转换单元,用于在所对应的字符串为有效的统一码文本格式UTF字符串时,将所述UTF字符串转换成UNICODE编码格式的字符串;
字节合并单元,用于在转换成UNICODE编码格式的字符串后,得到所述字符串的前两个字节,合并所述两个字节的数值得到字符UNICODE编码值。
在进一步的实施例中,为实现字符串的制作,所述嵌入式设备包括:
多语言字符串表生成单元,用于将每一种语言的字符串都生成各自独立的多语言字符串数据表,其中使用UTF-8编码作为字符串中每个字符的编码,数据表由字符串向量和字符串的UTF-8编码数据组成,所述字符串向量用于提供每个字符串数据的存放相对偏移地址,所述UTF-8编码数据用于存放每一个字符串转换成UTF-8编码后的字符数据。
在进一步的实施例中,为制作多语言字库,所述嵌入式设备包括:
位图文件生成单元,用于从Windows操作系统自带的矢量字库文件中提取指定大小的字体,并将该字体以位图的格式存放得到字符的位图文件;
多语言字库生成单元,用于将所述位图文件转换成字库的C语言头文件,使所述C语言头文件中字符的内部数据结构包括所述字符数据UNICODE编码向量表、字符宽度向量表以及字符点阵数据向量表,并且使字库中每个字符的UNICODE编码向量表、字符宽度向量表和字符点阵数据向量表中的顺序一致。
本发明的所述嵌入式设备可以是机顶盒,也可以是其他需要显示字符信息的各种嵌入式设备。
以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。