当前位置首页 > 百科资料> 正文

字体生成器

2022-07-08 19:37:57 百科资料

字体生成器支持生成多国文字非等宽显示点阵字库(由矢量字库转点阵字库)。可以自由生成任意字体、不同大小的点阵字库,主要应用在所有需要文字显示(点阵字库支持)的嵌入式系统中。

  • 中文名称 字体生成器
  • 外文名称 fontmaker
  • 软件大小 15.3M
  • 软件语言 英文

软件简介

  本软件

  软件特点

  转换速度非常快(秒级)不用注册,可以免费支持 16 点阵字库的转换。

软件信息

  软件名称:字体生成器(fontmaker)

  版 本:V1.0最新版

  软件大小: 15.3M

  软件分类: 汉字输入

  软件语言: 英文

  运行环镜: WinXP

  软件介绍:

功能描述

支持所有 windows 字符集

  CP932, 日文Shift-JIS, 如:日语

  CP936, 简体中文GBK, 如:中文(中华人民共和国), 中文(香港特别行政区), 中文(新加坡)

  CP949, 韩文, 如:朝鲜语

  CP950, 繁体中文Big5, 如;中文(台湾), 中文(澳门特别行政区)

  CP874, 泰文, 如:泰语

  CP1250, 中欧, 如:捷克语,匈牙利语,波兰语,罗马尼亚语,克罗地亚语,斯洛伐克语,阿尔巴尼亚语,斯洛文尼亚语,塞尔维亚语(拉丁文)

  CP1251, 西里尔文, 如:保加利亚语,俄语,乌克兰语,比利时语,马其顿语(FYROM),哈萨克语,吉尔吉斯语,鞑靼语,蒙古语,阿塞拜疆语,乌兹别克语,塞尔维亚语

  CP1252, 西欧(拉丁文I), 如:加泰隆语,丹麦语,德语,英语,西班牙语,芬兰语,法语,冰岛语,意大利语,荷兰语,挪威语,葡萄牙语,印度尼西亚语,巴士克语,南非语,法罗语,马来语,斯瓦希里语,加里西亚语,瑞典语

  CP1253, 希腊文, 如:希腊语

  CP1254, 土耳其文, 如:土耳其语,阿塞拜疆语,乌兹别克语

  CP1255, 希伯来文, 如:希伯来语

  CP1256, 阿拉伯文, 如:乌都语,波斯语,阿拉伯语(伊拉克,埃及,利比亚,阿尔及利亚,摩洛哥,突尼斯,阿曼,也门,叙利亚,约旦,黎巴嫩,科威特,阿联酋,巴林,卡塔尔)

  CP1257, 波罗的海文, 如:爱沙尼亚语,拉脱维亚语,立陶宛语,

  CP1258, 越南, 如:越南语

  unicode 可以由上述字符集根据需求自由合成。

支持多种文件输出

  A. BIN 文件(必生成):存储的是我们最终需要用到的点阵字库信息。其文件结构由四大部分组成:文件头、段信息、检索表、点阵信息。 1). 文件头,指的是文件的前十六个字节(BYTE),描述信息如下结构:

  typedef struct tagFontLibHeader{

  BYTEmagic[4];//'U'(or 'M'), 'F', 'L', X---Unicode(or MBCS) Font Library, X: 表示版本号. 分高低4位。如 0x12表示 Ver 1.2

  DWORD Size;/* File total size */

  BYTEnSection; // 共分几段数据,主要针对 UNICODE 编码有效。

  BYTEYSize; /* height of font */

  WORDwCpFlag; // codepageflag: bit0~bit13 每个bit分别代表一个CodePage 标志,如果是1,则表示当前CodePage 被选定,否则为非选定。

  charreserved[4]; // 预留字节

  } FL_Header;

  2). 段信息,只针对 UNICODE 编码有效,占字节数:nSection*sizeof(FL_SECTION_INF)。结构如下:

  typedef struct tagFlSectionInfo{

  WORD First; /* first character */

  WORD Last; /* last character */

  DWORD OffAddr; /* 指向的是当前SECTION包含的 UFL_CHAR_INFO第一个字符信息的起始地址 */

  } FL_SECTION_INF, *PFL_SECTION_INF;

  3). 检索表,只针对非等宽的MBCS(不包含简中、繁中、日文、韩文,因这些都将等宽处理,故无需检索表)和 UNICODE 字库有效。

  typedef struct tagUflCharInfo{

  #ifdefSUPPORT_MAX_FONT // 如采用大字体结构,最大可支持248点阵

  DWORD OffAddr; // 当前字符点阵数据的起始地址

  BYTE Width; // 字符点阵的像素的宽度

  #else

  DWORD OffAddr: 26; // 当前字符点阵数据的起始地址

  DWORD Width: 6; // 字符点阵的像素的宽度( 目前最大支持 56 点阵)

  #endif

  } UFL_CHAR_INDEX;

  如果是非等宽的MBCS字库,则占字节数为:0xff * sizeof(UFL_CHAR_INDEX);

  如果是Unicode字库,则占字节数为:((xxx[0].Last - xxx[0].First + 1)+...+(xxx[nSection-1].Last - xxx[nSection-1].First + 1)) * sizeof(UFL_CHAR_INDEX);

  4). 点阵信息,即当前所有包含字符集中字符的点阵信息集合。数据存储方式为:横向高到底位存储。如: 10110011 00011010 即为 B3. 1A

举例说明

  显示编码 code = xxxx 的字符。分为以下三种情况,分别操作步骤如下:

非等宽的MBCS字库

  a. 先读出FL_Header信息;

  b. 根据这个sizeof(FL_Header) + code * 2找到code的 UFL_CHAR_INDEX信息;

  c. 根据UFL_CHAR_INDEX的OffAddr再找到当前code的点阵信息;

  d. 最后根据FL_Header.Ysize、UFL_CHAR_INDEX.Width、以及点阵信息即可show出当前字符。

等宽的 MBCS字库

  (包括简中、繁中、日文、韩文)

  a. 先读出FL_Header信息;

  b. 计算出code在当前字符集中的索引值(index),然后根据这个sizeof(FL_Header) + index * (FL_Header.Ysize/8*FL_Header.Ysize)找到code的点阵信息;

  c. 然后根据FL_Header.Ysize与点阵信息即可show当前字符。

  计算出当前code在你当前字符集(codepage)中位置,即索引值。此函数主要针对MBCS编码中的简中,繁中,日文,韩文,

  static long GetPosWithMbcs(UINT code, UINT codepage)

  {

  long lIdx = -1;

  BYTE R = (code >> 8) & 0xFF; //区码

  BYTE C = code & 0xFF; //位码

  switch(codepage)

  {

  case CP932: // 日文

  if(R >= 0x81 && R <= 0x9F)

  {

  if(C >= 0x40 && C <= 0x7E)

  lIdx = (R-0x81)*187 + (C-0x40); //187 = (0x7E-0x40+1)+(0xFC-0x80+1);

  else if(C >= 0x80 && C <= 0xFC)

  lIdx = (R-0x81)*187 + (C-0x80)+62; // 62 = 0x7E-0x40+1;

  }

  else if(R >= 0xE0 && R <= 0xFC)

  {

  if(C >= 0x40 && C <= 0x7E)

  lIdx = 5797 + (R-0xE0)*187 + (C-0x40); // 5797 = 187 * (0x9F-0x81+1);

  else if(C >= 0x80 && C <= 0xFC)

  lIdx = 5797 + (R-0xE0)*187 + (C-0x80)+62;

  }

  break;

  case CP936: // 简中

  if((R >= 0xA1 && R <= 0xFE) && (C >= 0xA1 && C <= 0xFE))

  lIdx = (R-0xa1)*94 + (C-0xa1); //94 = (0xFE-0xA1+1);

  break;

  case CP949: // 韩文

  if(R >= 0x81)

  {

  if(C >= 0x41 && C <= 0x7E)

  lIdx = ((R-0x81) * 188 + (C - 0x41)); // 188 = (0x7E-0x41+1)+(0xFE-0x81+1);

  else if(C >= 0x81 && C <= 0xFE)

  lIdx = ((R-0x81) * 188 + (C - 0x81) + 62); // 62 = (0x7E-0x41+1);

  }

  break;

  case CP950: // 繁中

  if(R >= 0xA1 && R <= 0xFE)

  {

  if(C >= 0x40 && C <= 0x7E)

  lIdx = ((R-0xa1)*157+(C-0x40)); // 157 = (0x7E-0x40+1)+(0xFE-0xA1+1);

  else if(C >= 0xA1 && C <= 0xFE)

  lIdx = ((R-0xa1)*157+(C-0xa1)+63); // 63 = (0x7E-0x40+1);

  }

  break;

  default:

  break;

  }

  return lIdx;

  }

Unicode字库(可以包括所有字符集)

  a. 先读出FL_Header信息;

  b. 分析当前字符在第几段,比如在第n段,就可根据这个xxx[n].OffAddr+(code - xxx[n].First)* sizeof(UFL_CHAR_INDEX)找到字符索引信息(UFL_CHAR_INDEX);

  c. 根据UFL_CHAR_INDEX的OffAddr再找到当前code的点阵信息;

  d. 最后根据FL_Header.Ysize、UFL_CHAR_INDEX.Width、以及点阵信息即可show出当前字符。

  B. TXT 文件(可选择生成): 存储的是当前字库包含字符的字模显示效果。详见转换后结果。

  C. BMP 文件(可选择生成): 是将当前字库中所有字符点阵信息整合成的一个位图文件。(只针对 MBCS 编码有效)详见转换后结果。

  3. 支持预览功能

  你可以打开一个已生成的字库文件(*.bin),然后根据字库的编码类型(MBCS 或 UNICODE),在goto code:后面的编辑框中输入相应的编码,即可看到当前编码字符的显示效果,还可知其显示宽度。

  在预览过程中,可放大缩小当前字符的显示效果。

使用说明

转换字库

  操作步骤如下:

  1). 选择一个您要转换的矢量字体文件(*.ttf)。(先将c:windowsfonts 目录下的字体文件拷贝出来,然后本软件即可选择,建议去网上找一个ArialUni.ttf字库,目前很多linux系统用的就是这个,非常全面)

  2). 选择编码类型(MBCS or Unicode),根据需求而定。

  3). 选择字体大小,根据需求而定,目前只支持16,24,32,40,48,56,本软件可根据需求而改成大字体 ( > 56 )。

  4). 选择需要转换的字符集(支持多选),根据需求而定。比如:我要用到简体中文,则必须选简体中文,同时还可选其它。

  5). 选择输出文件。(BIN 文件始终默认输出,其它可选)

  6). 选择输出目录,即将您生成的文件存放到您选择的这个目录中。

  7). 点击 build 按钮,稍等片刻,即可生成您所想要的字库文件。

  注意: 如果您选择的是MBCS 编码方式,又有选择多个字符集,则会输出多份上述文件。

  如果您选择的是NICODE编码方式,不论你选多少个字符集,都只会输出一份上述文件。

  如果生成字库失败,则有可能你选择的字体文件(*.TTF)原本就不包含该字符集的字符信息。 比如:宋体中不存在韩文字符,即用宋体生成的字库无法支持韩文显示。

  参考办法: 对照系统自带的字符映射表,里面就可以选择不同的字体,字符集(打开"高级查看")进行参照。

开启字符映射表的方法

  1. 直接键入 "charmap",以命令方式运行开启。

  2. 程序-->附件-->系统工具--->字符映射表

  2. 字库预览,操作步骤如下:

  1). 选择一个您要预览的字库文件(*.bin)。将会自动打开分析出其编码类型,点阵大小,包含的字符集。

  2). 在 goto code:后面的编辑框中,输入您要查看字符的编码(如果当前选择的字库*.BIN 是unicode编码,则输入unicode码,否则输入mbcs 编码),回车后即可看到其显示效果,还可得知其字符实际显示宽度。

  另外,支持缩放预览。 拖动滑动条,可以放大缩小其预览效果。

注册

  在没有注册的情况下,只支持16点阵字库的转换,注册后可以支持24,32,40,48,56 ,还可根据需要修改到支持更大字体。

  注册方法: 点击 "Aoubt..." 按钮,则会弹出一个对话框,再点击 "注册..." 按钮根据提示操作即可。

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:baisebaisebaise@yeah.net