构建GB2312汉字库的unicode码表

构建 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.h>
void 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 short uni_table[]={
  0x4E00, /* GB2312 Code: 0xD2BB ==> Row:50 Col:27 */
  0x4E01, /* GB2312 Code: 0xB6A1 ==> Row:22 Col:01 */
  0x4E03, /* GB2312 Code: 0xC6DF ==> Row:38 Col:63 */
  0x4E07, /* GB2312 Code: 0xCDF2 ==> Row:45 Col:82 */
... ...
  0x9F9F, /* GB2312 Code: 0xB9EA ==> Row:25 Col:74 */
  0x9FA0, /* GB2312 Code: 0xD9DF ==> Row:57 Col:63 */
  0xE810, /* GB2312 Code: 0xD7FA ==> Row:55 Col:90 */
  0xE811, /* GB2312 Code: 0xD7FB ==> Row:55 Col:91 */
  0xE812, /* GB2312 Code: 0xD7FC ==> Row:55 Col:92 */
  0xE813, /* GB2312 Code: 0xD7FD ==> Row:55 Col:93 */
  0xE814 /* GB2312 Code: 0xD7FE ==> Row:55 Col:94 */
};

然后把这个生成的数组copy到项目代码中使用就okey了。hoho,其实在开发中编写代码来构造代码的机会很多,coder不用coding辅助自己开发 多浪费啊~ :)

本文配套源码

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数组
, unicode
, define
, gb2312
, 汉字
, short
, unsigned
substr_for_gb2312
unicode码表、unicode 转内码表、ascii码表 unicode、unicode码表下载、ascii码表和unicode,以便于您获取更多的相关知识。

时间: 2024-11-02 02:08:46

构建GB2312汉字库的unicode码表的相关文章

常用字符集编码详解(ASCII GB2312 GBK GB18030 unicode UTF-8)_应用技巧

ASCII ASCII码是7位编码,编码范围是0x00-0x7F.ASCII字符集包括英文字母.阿拉伯数字和标点符号等字符.其中0x00-0x20和0x7F共33个控制字符. 只支持ASCII码的系统会忽略每个字节的最高位,只认为低7位是有效位.HZ字符编码就是早期为了在只支持7位ASCII系统中传输中文而设计的编码.早期很多邮件系统也只支持ASCII编码,为了传输中文邮件必须使用BASE64或者其他编码方式. GB2312 GB2312是基于区位码设计的,区位码把编码表分为94个区,每个区对应

VC中实现GB2312、BIG5、Unicode编码转换的方法_C 语言

本文主要以实例形式讨论了VC编译环境下,实现字符串和文件编码方式转换的方法,在linux下请使用Strconv来实现.具体方法如下: 一.文件编码格式转换 //GB2312 编码文件转换成 Unicode: if((file_handle = fopen(filenam,"rb")) != NULL) { //从GB2312源文件以二进制的方式读取buffer numread = fread(str_buf_pool,sizeof(char),POOL_BUFF_SIZE,file_h

[Python爬虫] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题

        最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下笔记.方便以后查阅和大家学习.        中文编码问题的处理核心都是--保证所有的编码方式一致即可,包括编译器.数据库.浏览器编码方式等,而Python通常的处理流程是将unicode作为中间转换码进行过渡.先将待处理字符串用unicode函数以正确的编码转换为Unicode码,

彻底搞懂字符编码(unicode,mbcs,utf-8,utf-16,utf-32,big endian,little endian...)

最近有一些朋友常问我一些乱码的问题,和他们交流过程中,发现这个编码的相关知识还真是杂乱不堪,不少人对一些 知识理解似乎也有些偏差,网上百度,google的内容,也有不少以讹传讹,根本就是错误的(例如说 unicode编码是两 个字节),各种软件让你选择编码的时候,常常是很长的一个选单,让用户不知道该如何选.基于这样的问题,我就写 下我的理解吧,一方面帮助一些需要帮助的人纠正认识,一方面作为自己以后备查的资料. 1.ASCII(American Standard Code for Informat

UTF-8 GBK UTF8 GB2312 之间的区别和关系介绍_相关技巧

UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强.UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示.如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包. GBK是国家标准GB2312基础上扩容后兼容GB2312的标准.GBK的文字编码是用双字节来表示的,即不论中.英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1.GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大. GBK

PHP字符编码问题之GB2312 VS UTF-8解决方法

看代码: 复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&

java中文乱码解决之道(三)—–编码详情:伟大的创想—Unicode编码

随着计算机的发展.普及,世界各国为了适应本国的语言和字符都会自己设计一套自己的编码风格,正是由于这种乱,导致存在很多种编码方式,以至于同一个二进制数字可能会被解释成不同的符号.为了解决这种不兼容的问题,伟大的创想Unicode编码应时而生!! Unicode Unicode又称为统一码.万国码.单一码,它是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言.跨平台进行文本转换.处理的要求.可以想象Unicode作为一个"字符大容器&qu

Unicode编码(转)

随着计算机的发展.普及,世界各国为了适应本国的语言和字符都会自己设计一套自己的编码风格,正是由于这种乱,导致存在很多种编码方式,以至于同一个二进制数字可能会被解释成不同的符号.为了解决这种不兼容的问题,伟大的创想Unicode编码应时而生!! Unicode Unicode又称为统一码.万国码.单一码,它是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言.跨平台进行文本转换.处理的要求.可以想象Unicode作为一个"字符大容器&qu

MySQL字符集 GBK、GB2312、UTF8区别 解决MYSQL中文乱码问题_Mysql

MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:数据库字符集. character-set-table:数据库表字符集. 优先级依次增加.所以一般情况下只需要设置character-set-server,而在创建数据库和表时不特别指定字符集,这样统一采用character-set-server字符集. character-set-client:客户