加载中…
个人资料
建国雄心
建国雄心
  • 博客等级:
  • 博客积分:0
  • 博客访问:158,914
  • 关注人气:49
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

如何从点阵字库文件(*.bin)中获取点阵信息?

(2009-05-13 02:33:40)
标签:

unicode

mbcs

ansi

cjk

拉丁文

非等宽

点阵字库

字库文件

it

分类: 工具软件
======================================================================================
==================================================================================================

        由于选择的编码类型(MBCS 或 Unicode)以及字符集不同,则输出的字库文件所包含的数据段也会不同。如下例表:

    数据段         MBCS-CJK         MBCS-非等宽          Unicode
    -------------------------------------------------------------------
    文件头                                            Y
    段信息                                            Y
    检索表                                            Y
    点阵信息                                          Y
    
    Y:  包含          
    N: 不包含

注释:
   MBCS: MultiByteCharset,即多字节字符集(本地字符集)。
   CJK: China,Japan,Korea,即中(简体,繁体)日韩字符集。
   非等宽: 每个字符的显示宽度不等。 如字符'i','M'。 除了 CJK 外,其它都默认为非等宽字符集。
   Unicode: 即统一编码(宽字节字符集)
  
具体举例解析如下:

    注意:
    a. 数据都是低位在前,高位在后;
    b. 宽高都以像素为单位;
    c. 字符集从低到高顺序分别为:日文,简中,韩文,繁中,泰文,中欧,西里尔,西欧,希腊,土耳其文,希伯来文,阿拉伯文,波罗的海文,越南文;
   
        A. MBCS-CJK (等宽)
       
        00000000h: 4D 46 4C 10 50 FE 03 00 00 10 02 00 00 00 00 00
        00000010h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        00000020h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        00000040h: 00 00 00 00 30 00 18 00 0C 00 04 00 00 00 00 00
        ...
       
        解析如下:
        1). 文件头 ( 前 16 Byte )
   
    4D 46 4C 10 -- 标识头,判断是否为合法的字库文件。    
                   4D = 'M', 表示该文件为 MBCS 编码格式的字库文件。
                   46 = 'F', 4C = 'L'
                   10 表示该字库文件版本信息为: Version 1.0
    50 FE 03 00 -- 文件总长度
    00          -- 是否包含检索表。 0-标识无检索表
    10          -- 字体高度 (宽高都以像素为单位) 0x10 == 16
    02 00       -- 选择的字符集标志位。 1-标识选择, 0-标识未选择.   故得出当前选择为: 简中字符集。
    00 00 00 00 -- 预留字节   
        
       2). 点阵信息
       因为GB2312 的首个字符:0xA1A1, 它的点阵数据起始地址为 0x10,数据长度为:((字体高度+7)/8)* 字体高度 = ((16+7)/8)*16 = 32.
       故取如下 16 字节,即为字符0xA1A1的点阵信息。
       00000010h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
       00000020h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      
       同理如下即为字符0xA1A2的点阵信息。
       00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
       00000040h: 00 00 00 00 30 00 18 00 0C 00 04 00 00 00 00 00
   
   
    由于等宽,所以所有字符的点阵数据长度都为:((字体高度+7)/8)* 字体高度  = ?
       
       
      B. MBCS-非等宽
    Sample 子目录下的文件arialuni16_CP1252.bin, 文件内容如下:
   
    00000000h: 4D 46 4C 10 90 1A 00 00 01 10 80 00 00 00 00 00
    00000010h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000020h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000040h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000050h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000060h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000070h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000080h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000090h: 10 04 00 10 20 04 00 10 30 04 00 18 40 04 00 24
    ...
    00000410h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00000420h: 00 00 40 40 40 40 40 40 40 40 00 40 40 00 00 00
    ....
   
    解析如下:
    1). 文件头 ( 前 16 Byte )
   
    4D 46 4C 10 -- 标识头,判断是否为合法的字库文件。    
                   4D = 'M', 表示该文件为 MBCS 编码格式的字库文件。
                   46 = 'F', 4C = 'L'
                   10 表示该字库文件版本信息为: Version 1.0
    90 1A 00 00 -- 文件总长度
    01          -- 是否包含检索表。 1-标识有检索表
    10          -- 字体高度  0x10 == 16
    80 00       -- 选择的字符集标志位。 1-标识选择, 0-标识未选择. 故得出当前选择为: 西欧字符集。
    00 00 00 00 -- 预留字节
   
    2). 检索表
    从 00000010h 开始,每 4 个字节表示一个字符的检索信息, 且从字符 0x0 开始。故空格字符(' ')的检索信息(00000090h)为:10 04 00 10
    即得出一个 32 位数为: 0x10000410(十六进制) --- (00010000 00000000 00000100 00010000).
    高 6 位,表示当前字符的宽度。 故得出 000100 -- 4 (字库宽度为 4 )
    低 26 位, 表示当期字符的点阵信息的偏移地址。故得出 00 00000000 00000100 00010000 -- 0x410 (点阵信息的起始地址为 0x410)
      
       3). 点阵信息
       由于空格字符的起始地址为 0x410,且数据长度为:((字体宽度+7)/8)* 字体高度 = ((4+7)/8)*16 = 16.
       故取如下 16 字节,即为空格字符的点阵信息。
       00000410h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      
       同理如下即为字符'!' 的点阵信息。
       00000420h: 00 00 40 40 40 40 40 40 40 40 00 40 40 00 00 00
      
      
       C. Unicode
      
       00000000h: 55 46 4C 10 28 AB 07 00 01 10 81 00 00 00 00 00
       00000010h: 20 00 FF FF 18 00 00 00 98 FF 03 10 A8 FF 03 10
       ...
       0003ff90h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
       0003ffa0h: 00 00 00 00 00 00 00 00 00 00 40 40 40 40 40 40
       0003ffb0h: 40 40 00 40 40 00 00 00 00 00 48 48 48 48 00 00
       ...
  
     
    解析如下:
    1). 文件头 ( 前 16 Byte )
   
    55 46 4C 10 -- 标识头,判断是否为合法的字库文件。    
                   55 = 'U', 表示该文件为 unicode 编码格式的字库文件。
                   46 = 'F', 4C = 'L'
                   10 表示该字库文件版本信息为: Version 1.0
    28 AB 07 00 -- 文件总长度
    01          -- 包含几个Section。 1- 1 Section (  在不包括CJK时,会分成3 Section)
    10          -- 字体高度  0x10 == 16
    81 00       -- 选择的字符集标志位。 1-标识选择, 0-标识未选择. 故得出当前选择为: 日文+西欧字符集。
    00 00 00 00 -- 预留字节
   
    2). 段信息 (n section * sizeof(FL_SECTION_INF) = 1 * 8 = 8))
    20 00 -- First character
    FF FF -- Last character
    18 00 00 00 -- OffAddr;         
   
    3). 检索表 ((Section[0].Last - Section[0].First + 1) * 4 + (Section[n-1].Last - Section[n-1].First + 1) * 4)
    每 4 个字节表示一个字符的检索信息, 且从字符Section[0].First 开始。故字符0x20的检索信息(起始地址 =
    (字符的unicode码 - Section[x].First) × 4 + Section[x].OffAddr,  x 为当前字符处在的section索引值,可判断得出。)为:98 FF 03 10
    即得出一个 32 位数为: 0x1003FF98(十六进制) --- (00010000 00000011 11111111 10011000).
    高 6 位,表示当前字符的宽度。 故得出 000100 -- 4 (字库宽度为 4 )
    低 26 位, 表示当期字符的点阵信息的偏移地址。故得出 00 00000011 11111111 10011000 -- 0x3FF98 (点阵信息的起始地址为 0x3FF98)
      
       3). 点阵信息
       由于空格字符的起始地址为 0x3FF98,且数据长度为:((字体宽度+7)/8)* 字体高度 = ((4+7)/8)*16 = 16.
       故取如下 16 字节,即为空格字符的点阵信息。
       0003ff98h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      
       同理如下即为字符0x21 的点阵信息。
       0003ffA8h: 00 00 40 40 40 40 40 40 40 40 00 40 40 00 00 00
       

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有