简介
虽然很简单但惊讶于没有相关教程,甚至似乎也没有很多字体资源可供使用。
我的眼睛被可怖的字体伤害到了,因此写本文拯救大家的眼睛。
需求软件
FontForge:用于制作合并字体
JPEXS Flash Free Decompiler:用于替换 swf
文件中的字体。
声明
制作合并字体
对字体稍有了解的人应该知道,在 Unicode 中,有一个被称为 Private Use Area
的 code range,不会被 Unicode 分配字符。
现在通行的基于大学汉化的龙语字体就是使用了该区域中 0xE027-0xE057
也就是 57383-57431
这个范围来存储龙语字符。因此通用字体自然不支持显示了。
与此同时,中文字体的英文显示效果往往也比较差劲,尤其是在字间距方面。因此我们也迫切需要一种能利用好看的英文字体的中文字体。
本质上来说将英文合并到中文字体里,与为字体添加龙语支持没有什么不同。
故此本文实际上是一个网上十分常见的合并字体的教学,只是添加了龙语部分。
本文将使用 FontForge
这款软件来制作合并字体,操作简单,唯一的坏处就是这个软件很容易崩溃,尤其是打开的字体多了之后。
本文选用的示例字体为 SourceHanSansCN
与 Alegreya
。
确认字符大小
打开 FontForge
,在菜单 File > Open
载入你所需要合并的中文与英文字体。
文件夹界面很难用,但是有个输入框可以直接粘贴带文件名的完整路径,然后点击 OK 即可载入。
在菜单 Element > Font Info
中找到 General
一栏,查看其 Em Size
是否一致。
如果不一致,那么需要将较小的那个 Em Size
设置为与更大的那个字体相同的数值。
然后在 OS/2
一栏中找到 Panose
,将所有选项都设置为 Any
。
设置完毕后点击 OK 退出菜单。
最后,选择 File > Generate Fonts
,字体类型选择 TrueType
,取消勾选 Validate Before Saving
,然后点击 Generate
生成放大后的字体。
后续一切以操作放大后的字体为准。
合并字体
我们一共需要 Regular
和 Bold
两个字重,本文以 Regular
为例,后续自行对 Bold
执行相同流程即可。
如果你要合并的字体,例如我所使用的 SourceHanSansCN
,是 otf
格式的,那么你在 FontForge
中打开它之后大概看不到任何字形。这是正常的。
若想看到字形,在菜单中选择 CID > Flatten
即可。
修改字体信息
打开你所需要保留的英文字体。打开菜单 Element > Font Info
,在 PS-Name
一栏中修改前三项内容。
其中:
Fontname
:字体名,应该包含字重。格式应该为:字体名-字重
,并且字符数需小于 29。例如我所使用的:SHSansAlegreyaDB-Regular
。
Family Name
:字族名。我在这里使用的是 SHSansAlegreyaDB
,你也可以使用可读性更强的名字。
Name For Humans
:可读名。我使用的是 Source Han Sans Alegreya Dragonborn
。
如果你的填写正确,那么选择 TTF Names
一栏,应该能发现 Family
变为了你所填写的字族名,Styles (SubFamily)
为 Regular
,Fullname
则是可读名加上 Regular
作为后缀。
选择 OS/2
,Charsets
一栏勾选两个 Default
选项,Panose
一栏全部设置为 Any
。
点击 OK 保存,软件会提示需要生成 UniqueID
,选是即可。
导入中文
合并字体会保留原始字体已有的字形,并加入新增字体的字形。因此我们需要以英文字体为基,导入中文字体。
打开 Element > Merge Fonts
菜单。如果你使用 FontForge
打开了其他字体,那么下拉框里会出现打开的字体选择。
如果没有,选择 Others
然后点击 OK,会出现弹框,输入中文字体的完整路径,然后打开即可。
软件会询问是否保留 Kerning 信息,选是即可。
缺失字形问题
导入中文后的字体,可能会发现有不少常用字的字形显示为空白。
有时这似乎只是一个软件错误,比如 Alegreya 的合并版本。打开保存后的字体会发现这些字形是存在的。并且能够正常在 VS Code/Word/PS 里使用。如果使用 JPEXS 往大学版本 swf 里嵌入字体,那么也可以正常使用。但在 Adobe Animate 里不仅缺字形,生成的 swf 同样缺字形。
有时却是真的不存在这些字形,比如我用 Fira Code 合并的版本。但如果使用 JPEXS 往大学版本 swf 里嵌入字体,进游戏发现居然能用。但是同样的,在 Adobe Animate 和生成的 swf 中都缺字形。
更令人惊奇的是,An 生成出来的缺字形 swf,在 JPEXS 里重复替换过一次之后,居然就不缺字形了,也能正常在游戏内使用。更奇怪的是我用 An 生成的某个版本的 swf 中不需要替换 JPEXS 里就显示 Fira Code 版本不缺字形,但是无论在 JPEXS 里替换与否,进游戏发现还是缺。
总之我发现的现象就是,无论如何,使用 JPEXS 往大学版本 swf 里嵌入字体,肯定能用。使用 Adobe Animate 生成字体,肯定不能用(要么就是我不会用)。
我不理解,但宇宙并没有义务让我理解,所以原因我暂且蒙古。总之大概是 FontForge 的 bug。
此外,我还发现使用 An 生成的 swf 文件时,会导致读取存档界面的文字不对齐,且包括载入界面文字在内字体会偏大,我也不知道为什么。
合并龙语
我最早在 2012 年的时候就发现了一款名为 dragonborn
的龙语字体。不过该字体是将英文与数字、符号的字形替换为了龙语。
如果需要将龙语字形合并到自制的字体里,那对照龙语表也挺麻烦的,因此你可以下载后附的我使用的原始字体文件来完成这一步。
单击任意一个字形框,你会在菜单下面看到该字符的信息。例如:32415 (0x7e9f) U+7E9F "uni2EB0" CJK UNIFIED IDEOGRAPH-7E9F
。
点击菜单 View > Goto
,在弹出框输入我们所需要的 57383
,跳转到对应字符。单击它,信息栏会显示它属于 Private Use Area
。
打开我所提供的字体文件,同样找到该字形,它应该是一个龙语 A 的字形。长按鼠标拖动选择全部龙语字形,右键点击 Copy
。
回到我们正在编辑的字体中,选中 57383 (0xE027)
,右键点击 Paste
,将字形粘贴过来即可。
缩放字体
如果你的字体过大,在游戏里的部分文字显示效果可能不是很好,例如:载入界面的文字、UI 的按键提示文字、通知文字、发现新地点的文字。
其中,发现新地点的文字有可能因为字体太大而显示不全,因此我们需要调整字体尺寸。
执行以下步骤:
- 按
Ctrl+A
选中所有字形
- 点击菜单
Element > Simplify > Simplify
,等待执行完毕
- 点击菜单
Element > Transformations > Transform...
Origin
选择 Glyph Origin
- 勾选
Round to Int
- 下拉框改为
Scale Uniformly
,数字填写你需要的缩放比例,比如 80
- 点击 OK,等待执行完毕
导出字体
打开 File > Generate Fonts
菜单,字体类型选择 TrueType
,取消勾选 Validate Before Saving
,然后点击 Generate
生成合并后的字体。
如果软件提示 Em Size
不是 2 的倍数,忽略即可。
测试字体
Windows 重复安装字体问题: 由于 Windows 的神秘 bug,重复安装字体时的弹框选择“替换”,它并不是真的替换,而是新增了一个 _0
的递增后缀,旧版本并不删除。同时 控制面板 > 字体
中不一定显示,而 设置 > 个性化 > 字体
里虽然能显示,但无法删除旧的版本。因此当你新生成字体后,一定记得在重新安装前先卸载旧的版本。否则无论是 VS Code 还是 Word 都只会使用无后缀的版本!
安装我们刚刚生成的字体,打开一个文本编辑器,我使用 VS Code
,Word 亦可。注意需要启动新实例/重启来载入新安装的字体,但 Word 似乎不需要。在 File > Preference > Profile > Create Profile
新建一个配置文件来测试字体。
测试文本如下,将它粘贴到你的文本编辑器中。英文的前一行不是空白的,请复制完整。
;下面一行不是空白的
A B c D E F G H I J K L M N O P Q R S T U V W X Y Z
aa ei ii ah uu ur ir oo ey
;未使用
在你的文本编辑器中配置你新建的字体。例如我使用 SHSansAlegreyaDB Regular
作为字体名。如果你使用 Word 并且无法找到新建的字体(这似乎是因为 Windows 没有把这个字体写入注册表,右键字体文件选择为所有用户安装可能可以解决),直接输入这个名字并回车也可以。
生成 swf
文件
正如上面所说,因为未知原因导致使用 Adobe Animate 生成的 swf 文件必定缺字,因此使用 JPEXS Flash Free Decompiler
进行编辑。
使用 JPEXS Flash Free Decompiler 打开 swf 文件,或把 swf 文件拖进去。
然后展开 fonts
一栏。你会看到两个字体,其中一个带有 -Bold
后缀。单击其中一个字体文件,在右边 Parameters
窗口的右下角找到 Embed
,点击后单击弹出框上方 TTF File <select>
右边的按钮选择文件,然后勾选 All characters
,然后确定。弹出框会询问你有重复字符,是否替换,选择 Yes to All
,然后等待导入完成后会再次询问是否需要更新文本,选择是。
如果你不想使用 wqy-microhei
作为字体名(推荐修改),那么点击右边 Parameters
窗口下方的 Edit
按钮,然后滚动到最上面,修改 Font name in tag
即可。注意名字不能相同,粗体版本的 Is bold
需要打钩,它应该已经勾上了。
后续使用的是在这里设置的字体名,而不是字体文件中的字体名!
然后点击左上角保存或另存为即可。
修改 fontconfig
打开 fontconfig.txt
,添加一行 fontlib "Interface\你的文件名.swf"
。然后修改下面的映射,最好使用工具进行批量替换。
例如我的配置:
fontlib "Interface\fonts_console.swf"
fontlib "Interface\fonts_en.swf"
fontlib "Interface\DX_SkyrimBooks_Gaelic & FZLiBian (Bold).swf"
fontlib "Interface\DX_SkyrimBooks_Handwritten_Bold & SentyZHAO.swf"
fontlib "Interface\SourceHanSansAlegreya.swf"
fontlib "Interface\SourceHanSansFiraCode.swf"
map "$Iconographia" = "Iconographia" Normal
map "$ConsoleFont" = "SourceHanSansFiraCode" Normal
map "$DialogueFont" = "SourceHanSansAlegreya" Normal
map "$EverywhereFont" = "SourceHanSansAlegreya" Normal
map "$EverywhereBoldFont" = "SourceHanSansAlegreya-Bold" Bold
map "$EverywhereMediumFont" = "SourceHanSansAlegreya" Normal
map "$CreditsFont" = "SourceHanSansAlegreya" Normal
map "$DragonFont" = "Dragon_script" Normal
map "$SkyrimBooks" = "SkyrimBooks_Gaelic & FZLiBian" Bold
map "$HandwrittenFont" = "SkyrimBooks_Handwritten_Bold & SentyZHAO" Normal
map "$HandwrittenfontB" = "SkyrimBooks_Handwritten_Bold & SentyZHAO" Normal
map "$HandwrittenBold" = "SkyrimBooks_Handwritten_Bold & SentyZHAO" Normal
map "$FalmerFont" = "Falmer" Normal
map "$DwemerFont" = "Dwemer" Normal
map "$DaedricFont" = "Daedric" Normal
map "$MageScriptFont" = "Mage Script" Normal
map "$SkyrimSymbolsFont" = "SkyrimSymbols" Normal
map "$SkyrimBooks_UnreadableFont" = "SkyrimBooks_Unreadable" Normal
map "$CClub_Font" = "SourceHanSansAlegreya" Normal
map "$CClub_Font_Bold" = "SourceHanSansAlegreya-Bold" Bold
map "$ControllerButtons" = "Controller Buttons" Normal
map "$ControllerButtonsInverted" = "Controller Buttons inverted" Normal
其中,SourceHanSansFiraCode
是我另外制作的合并了 FiraCode
的版本,并且为两个 swf 文件的都进行了字体重命名。这样才能实现控制台单独的字体。
在 MO2 中创建空模组,打开它并创建 Interface
文件夹,将所有 swf 文件和 fontconfig.txt
都放入这个文件夹里。启用该模组。
进游戏!
谢天谢地,一切正常。完。
资源下载
我想直接用你的!
你的字体太tm大了,有没有小点的?
有没有思源宋体版的?
原始字体文件,可用于提取龙语字形