构建 GB2312 汉字库的 unicode 码表

2016-01-29 12:17 49 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

构建 GB2312 汉字库的 unicode 码表

作者:乾坤一笑

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

下载源代码

  构建 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
                        

来源:https://www.tulaoshi.com/n/20160129/1485396.html

延伸阅读
标签: Web开发
不知道大家在做页面的时候会不会遇到样式定义不生效的问题,基本的表现就是怎么改样式都没显示或只有某些浏览器正常,这时通常需要做下面的几步: 确认所修改的样式文件是否是当前页面的样式文件(多个环境的情况) 确认文件中的路径是否正确(可能手误多写或少写) 如果上面两点都确认没问题或只是一部分样式失效,基本可以确定是文件的编...
标签: 服务器
Linux安装GBK/GB2312程序显示乱码的五种解决方法   不少用户在Linux系统中安装GBK或GB2312的时候遇到了乱码问题,这主要是系统默认语言是uft8所导致,对于该问题可用五种方法进行解决,下面小编就给大家介绍下Linux安装GBK或GB2312程序显示乱码的解决方法。 解决方法: 找到etc/httpd/conf/ 目录中的httpd.conf ...
标签: Web开发
Dreamweaver CS3默认的新建文档的编码是UTF-8,这对于有些只做GB2312编码网站的设计师来说每次都在页面设置中修改有点麻烦。 其实我们完全可以将Dreamweaver CS3默认的UTF-8编码修改成GB2312,这样我们以后新建的网页就会是GB2312编码了。 首先我们打开Dreamweaver CS3的编辑菜单-选择首选参数设置。如下图:     再选择新建...
标签: Web开发
很多可能在转摘过程中失真或未经验证就被转摘,真正使用时却不行,也由此决定自己全方位试验一下,努力还是没有白费,虽然最终得出的结果是很简单的,但其过程对于一个新学AJAX的人来说,真是挺累。 欢迎您在使用过程中对新的心得一起跟帖交流,一个思想+一个思想,至少可以产生两个思想。 一、在GET发送时: 方法1:在ASP服务器端用Respo...
标签: Web开发
UTF-8是UTF-8编码是一种目前广泛应用于网页的编码,它其实是一种Unicode编码,即致力于把全球所有语言纳入一个统一的编码。前UTF-8已经把几种重要的亚洲语言纳入,包括简繁中文和日韩文字。所以在制作某些网站时,需要使用UTF-8,那么怎么把gb2312编码转换到utf-8编码呢?在dreamweaver里只需要一步即可实现。 找到菜单的修改——页面属性——...

经验教程

53

收藏

19
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部