构建 GB2312 汉字库的 unicode 码表

丶念芳

丶念芳

2016-01-29 12:17

构建 GB2312 汉字库的 unicode 码表,构建 GB2312 汉字库的 unicode 码表

构建 GB2312 汉字库的 unicode 码表

作者:乾坤一笑

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)

下载源代码

  构建 GB2312 汉字库的 unicode 码表嵌入式系统总离不了处理汉字。一般汉字的处理方法是(以手机接受短信为例):比如你收到了一封短信,该短信解码后是按照 UTF-16 表示的,那么我们需要根据每一个汉字的unicode 码找到它在 GB2312 库中的位置,然后再用对应的点阵数据在屏幕上显示出来。
  于是乎,必须有一种手段将 unicode 码和汉字字模的数据对应起来。最常用的手段是做一个 unicode 码表,在该数组中查找到匹配的 unicode 码后,用匹配的 index(数组索引)值在另外一个由该 index 值对应的字模记录的数组中的数据去显示。

+-----------------+ 查表 +-----------------+ 同index +-------------------+
| 汉字的unicode码 | == | unicode码表数组 | ======= | 汉字字模数据数组 | == 显示输出
+-----------------+ +-----------------+ +-------------------+

本文简要介绍一下如何生成 unicode 码表,其它相关的汉字处理技术不在本文的讨论范围之内。:)

用下面两个函数可以把 unicode 码表构造出来(*注1):

void UnicodeToGB2312(unsigned char* pOut,unsigned short uData){    WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(unsigned short),NULL,NULL);    return;}      void Gb2312ToUnicode(unsigned short* pOut,unsigned char *gbBuffer){    MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);    return;}
一个简单的例子如下(随手写的一段代码,只是演示一下构造数组的过程,不要挑刺儿啊! ^_^ ):
/*-----------------------------------------------*|  GB2312 unicode table constructor               ||  author: Spark Song  ||  file  : build_uni_table.c                      ||  date  : 2005-11-18  |*-----------------------------------------------*/#include <stdio.h#include <windows.hvoid UnicodeToGB2312(unsigned char* pOut,unsigned short uData);void Gb2312ToUnicode(unsigned short* pOut,unsigned char *gbBuffer);void construct_unicode_table();int main(int argc, char *argv[]){construct_unicode_table();return 0;}void construct_unicode_table(){    #define GB2312_MATRIX   (94)    #define DELTA           (0xA0)    #define FONT_ROW_BEGIN (16  + DELTA)    #define FONT_ROW_END   (87 + DELTA)    #define FONT_COL_BEGIN (1  + DELTA)    #define FONT_COL_END   (GB2312_MATRIX + DELTA)    #define FONT_TOTAL     (72 * GB2312_MATRIX)    int i, j;    unsigned char   chr[2];    unsigned short  uni;    unsigned short  data[FONT_TOTAL] = {0};    int index = 0;    unsigned short buf;    //生成unicode码表    for (i=FONT_ROW_BEGIN; i<=FONT_ROW_END; i++)        for(j=FONT_COL_BEGIN; j<=FONT_COL_END; j++)        {            chr[0] = i;             chr[1] = j;            Gb2312ToUnicode(&uni, chr);            data[index] = uni; index++;        }   //排个序,以后检索的时候就可以用binary-search了    for (i=0;i<index-1; i++)        for(j=i+1; j<index; j++)            if (data[i]data[j])            {                buf = data[i];                 data[i] = data[j];                data[j] = buf;            }                    //输出到STD_OUT    printf("const unsigned short uni_table[]={n");    for (i=0; i<index; i++)    {        uni = data[i];        UnicodeToGB2312(chr, uni);        printf("    0x%.4X%s /* GB2312 Code: 0x%.2X%.2X == Row:%.2d Col:%.2d */n",                 uni,                 i==index-1?" ":",",                chr[0],                chr[1],                chr[0] - DELTA,                chr[1] - DELTA                );    }    printf("};n");    return ;}void UnicodeToGB2312(unsigned char* pOut,unsigned short uData){    WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(unsigned short),NULL,NULL);    return;}      void Gb2312ToUnicode(unsigned short* pOut,unsigned char *gbBuffer){    MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);    return;}      
用 VC 编译后,在 DOS 中执行:
build_uni_table.exe  report.txt

可以得到如下的txt文件:

const unsigned      
展开更多 50%)
分享

猜你喜欢

构建 GB2312 汉字库的 unicode 码表

C语言教程 C语言函数
构建 GB2312 汉字库的 unicode 码表

用php实现gb2312和unicode间的编码转换

PHP
用php实现gb2312和unicode间的编码转换

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

UTF-8转GB2312函数

Web开发
UTF-8转GB2312函数

javascript gb2312转utf-8

Web开发
javascript gb2312转utf-8

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

jsp Unsupported encoding: gb2312 错误原因

Web开发
jsp Unsupported encoding: gb2312 错误原因

UTF-8与GB2312之间的互换

C语言教程 C语言函数
UTF-8与GB2312之间的互换

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Xhtml第5天:head区的其他设置

Xhtml第5天:head区的其他设置

《暗黑战神》职业解析

《暗黑战神》职业解析
下拉加载更多内容 ↓