一、軟體簡介
本軟體支持生成多國文字非等寬顯示點陣字庫(由矢量字型檔轉點陣字型檔)。可以自由生成任意字型、不同大小的點陣字型檔,主要套用在所有需要文字顯示(點陣字型檔支持)的嵌入式系統中。
軟體特點
轉換速度非常快(秒級)不用註冊,可以免費支持 16 點陣字型檔的轉換。
二、軟體信息
軟體名稱:字型生成器(fontmaker)
版 本:V1.0最新版
軟體大小: 15.3M
軟體分類: 漢字輸入
軟體語言: 英文
運行環鏡: WinXP
軟體介紹:
三、功能描述
1.支持所有 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 的字元。分為以下三種情況,分別操作步驟如下:
(1). 非等寬的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出當前字元。
(包括簡中、繁中、日文、韓文)
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;
}
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. 轉換字型檔操作步驟如下:
1). 選擇一個您要轉換的矢量字型檔(*.ttf)。(先將c:\windows\fonts 目錄下的字型檔拷貝出來,然後本軟體即可選擇,建議去網上找一個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..." 按鈕,則會彈出一個對話框,再點擊 "註冊..." 按鈕根據提示操作即可。