打印

关于字库HZK16的问题

[复制链接]
6783|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
HELLO_LEI|  楼主 | 2008-8-15 11:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
winloop| | 2008-8-15 11:45 | 只看该作者

当然有

使用特权

评论回复
板凳
HELLO_LEI|  楼主 | 2008-8-15 11:53 | 只看该作者

谢谢,请问下怎么提取?和汉字有什么区别?

使用特权

评论回复
地板
HELLO_LEI|  楼主 | 2008-8-15 11:55 | 只看该作者

这个是汉字提取,只是数字和英文不知道是怎样的位置

/**************从HZK16中提取字模的数据*********************************/
unsigned char ChineseData16(unsigned char *s)
{
    unsigned char HighData,LowData;
    unsigned long Location;
    if(*s)
    {
        HighData    =    *s    -    0xa0;
        LowData        =    *(s    +1)    -    0xa0;
        Location    =    (94    *    (HighData    -    1)    +    (LowData    -    1))    *    32L;
        AT45_MainMemoryRead(Location/264,Location%264,32);    
        return *test;
    }

使用特权

评论回复
5
xwj| | 2008-8-15 13:07 | 只看该作者

UCDOS的HZK16只有全角的字符

包括好几种字体、形状的数字和字母

如果要用半角的数字,需要自己修改后放到字库的空白区

HZK16里面最好玩的字符就是这个了:


使用特权

评论回复
6
xwj| | 2008-8-15 13:10 | 只看该作者

再来看看HZK16里面出了汉字还有什么:


0x0000-0xb000这一段:



PS:中午网络繁忙,传不上图,下午再说:-)

使用特权

评论回复
7
HELLO_LEI|  楼主 | 2008-8-15 13:39 | 只看该作者

谢谢

全角是表示就是16*16,半角表示16*8??还有字符和英文字母怎么来提取字模?

使用特权

评论回复
8
dld2| | 2008-8-15 14:06 | 只看该作者

俺来学习一下

使用特权

评论回复
9
xwj| | 2008-8-15 14:15 | 只看该作者

自己上网去搜!

讲这个的太多了

使用特权

评论回复
10
HELLO_LEI|  楼主 | 2008-8-15 14:17 | 只看该作者

搜了半天,没有搜到

搜了半天,没有搜到

使用特权

评论回复
11
HELLO_LEI|  楼主 | 2008-8-15 14:21 | 只看该作者

都没有提及数字和英文字母的提取

  HZK16字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个。其中一级汉字有3755个,按声序排列,二级汉字有3008个,按偏旁部首排列。我们在一些应用场合根本用不到这么多汉字字模,所以在应用时就可以只提取部分字体作为己用。

  HZK16字库里的16×16汉字一共需要256个点来显示,也就是说需要32个字节才能达到显示一个普通汉字的目的。

  我们知道一个GB2312汉字是由两个字节编码的,范围为A1A1~FEFE。A1-A9为符号区,B0到F7为汉字区。每一个区有94个字符(注意:这只是编码的许可范围,不一定都有字型对应,比如符号区就有很多编码空白区域)。下面以汉字“我”为例,介绍如何在HZK16文件中找到它对应的32个字节的字模数据。

  前面说到一个汉字占两个字节,这两个中前一个字节为该汉字的区号,后一个字节为该字的位号。其中,每个区记录94个汉字,位号为该字在该区中的位置。所以要找到“我”在hzk16库中的位置就必须得到它的区码和位码。(为了区别使用了区码和区号,其实是一个东西,别被我误导了)

  区码:区号(汉字的第一个字节)-0xa0    (因为汉字编码是从0xa0区开始的,所以文件最前面就是从0xa0区开始,要算出相对区码)

  位码:位号(汉字的第二个字节)-0xa0 

  这样我们就可以得到汉字在HZK16中的绝对偏移位置:

  offset=(94*(区码-1)+(位码-1))*32

  注解:1、区码减1是因为数组是以0为开始而区号位号是以1为开始的

            2、(94*(区号-1)+位号-1)是一个汉字字模占用的字节数

           3、最后乘以32是因为汉字库文应从该位置起的32字节信息记录该字的字模信息(前面提到一个汉字要有32个字节显示)

  有了偏移地址就可以从HZK16中读取汉字编码了,剩下的就是文件操作了,就不说了,要看代码可以到我的**:“hzk16汉字库的简单读写程序 ”看一下,是一个最简单的c语言程序。

使用特权

评论回复
12
dld2| | 2008-8-15 14:36 | 只看该作者

随便搜了一下

http://www.c51.cn/Article/mcuzh/200604/4121.html

只要知道编码,应该和汉字是一样。

使用特权

评论回复
13
HELLO_LEI|  楼主 | 2008-8-15 14:58 | 只看该作者

不知道编码怎么获取,现在提取不出要显示的英文和数字,中文

不知道编码怎么获取,现在提取不出要显示的英文和数字,中文可以

使用特权

评论回复
14
李冬发| | 2008-8-15 14:58 | 只看该作者

半角的ascii是从PC的ROM里提取出来的,好看

使用特权

评论回复
15
HELLO_LEI|  楼主 | 2008-8-15 16:56 | 只看该作者

这些字符除了查表,还有别的获取区位码的方法吗?

  0 1 2 3 4 5 6 7 8 9 0   ! " # ¥ % & ' ( ) 1 * + , - . / 0 1 2 3 2 4 5 6 7 8 9 : ; < = 3 > ? @ A B C D E F G 4 H I J K L M N O P Q 5 R S T U V W X Y Z [ 6 \ ] ^ _ ` a b c d e 7 f g h i j k l m n o 8 p q r s t u v w x y 9 z { | } 

使用特权

评论回复
16
xwj| | 2008-8-15 16:59 | 只看该作者

唉,打字时把输入法设为全角即可

使用特权

评论回复
17
HELLO_LEI|  楼主 | 2008-8-15 17:03 | 只看该作者

谢谢

谢谢

使用特权

评论回复
18
HELLO_LEI|  楼主 | 2008-8-15 17:09 | 只看该作者

程序中汉字半全角好象没关系,英文没有半全角之分呀

使用特权

评论回复
19
chqic| | 2014-1-1 22:39 | 只看该作者
怎么下载不呢?

使用特权

评论回复
20
一般首席| | 2014-3-27 18:32 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

24

帖子

0

粉丝