这更像是一个“转换技巧”,而不是真正的难题,因为在最坏的情况下,我可以使用我的 Mac 来执行转换,但我真的想了解为什么我使用的 Linux 工具无法完成转换,这样我就可以帮助其他人从 macOS 迁移到 Linux。虽然在这种情况下可能如此,但我怀疑答案最终可能是在 macOS 中转换字体文件,然后将转换后的文件带到 Linux。在 Fedora 39 发行版上,截至今天,所有操作系统补丁都是最新的。
在原始 Macintosh Programmer's Workshop (MPW) 字体的镜像站点是当时典型的 Macintosh Classic OS 字体文件的 BinHex 和 StuffIt 文件。我之所以选择它,是因为我认为它很小,使用起来很简单,而且我想将它 Nerd Font 化,以增添怀旧气息。我想将其位图部分(9、10 和 12 点)转换为 PCF 文件,将其 TrueType 部分转换为 TTF 文件。
Unix FILE(1) 报告该.hqx
文件是BinHex binary text, version 4.0, ASCII text
.
使用macutils 的hexbin
呈现二进制 StuffIt 文件的实用程序很简单,使用调用hexbin -fl ./MPW_Font.sit.hqx
,生成一个MPW_Font.sit
文件。Unix FILE(1) 会忠实地将.sit
文件报告为StuffIt Archive
。
使用取消存档unar
解压 StuffIt 存档文件的工具也很简单,使用调用unar MPW_Font.sit
,它会生成一个名为的目录MPW Font
和三个文件:
MPW Font ReadMe
,一个 PDF 文件,可以很容易地打开。MPW.frk
,这看起来像是 Unarchiver 为运行以下操作系统的 Unix 系统创建的伪 AFP(Apple 文件协议)兼容资源分支网络谈话,但通常.frk
后缀名是目录而不是文件。MPW.rsrc
,md5sum
-确认与相同MPW.frk
,并且资源分叉。
由于文件 #2 和 #3 完全相同,因此我将重点放在了 上MPW.rsrc
。Unix FILE(1) 将其报告为AppleDouble encoded Macintosh file
。因此,它是 AppleDouble 格式的资源文件。这就是我陷入困境的地方,因为任何试图将资源文件从 AppleDouble 容器中分离出来的尝试都会失败。
这rsrcdump
公用事业将 AppleDouble 文件解析为资源文件:
$ rsrcdump --extract MPW.rsrc
NFNT 30637 2576
NFNT 28920 3034
NFNT 25312 4002
FOND 5735 678 MPW
movp 0 14
sfnt 4969 61904 MPW
vers 1 46
kvst 128 36
Wrote "MPW.json"
该 JSON 显示了资源分支的原始二进制数据的转储,因此我确信没有损坏。fondu
公用事业不将该文件识别为所谓的“裸资源分支”:
$ fondu -show MPW.rsrc
Can't find an appropriate resource fork in MPW.rsrc
因为fondu
也理解 MacBinary,所以我尝试了netatalk 分支branch-netatalk-2-2
megatron
实用程序(该版本之后不可用,因此分支对于构建和提取实用程序很有用),调用它macbinary
从 AppleDouble 转换为 MacBinary,这也失败了:
$ macbinary MPW.rsrc
MPW.rsrc is not an adouble file.
然后我尝试FontForge,但它无法MPW.rsrc
在“打开文件”对话框中识别该文件。观察发现,如果 Mac Classic 字体套件文件带有后缀,则 FontForge 可以在 OS X 上读取它.suit
,我尝试创建带有该后缀的副本MPW.rsrc
,当我为过滤器选择“所有字体”时,FontForge 无法在 Linux 上识别它(猜测 FontForge 用于处理这些文件的库仅存在于 OS X 版本中)。如果我将过滤器设置为“所有文件”并强制打开或文件.rsrc
,.suit
我会收到错误:
MPW.rsrc 不是已知格式(或者使用了 fontforge 不支持的格式的功能,或者损坏严重,无法读取)
我尝试跑步macbinconv.exe
在下面葡萄酒将资源分叉从其 AppleDouble 容器中分离出来,但也失败并出现以下错误:
$ wine ~/.local/bin/macbinconv.exe -dfrf none MPW.rsrc -info md5
002c:fixme:winediag:loader_init wine-staging 9.1 is a testing version containing experimental patches.
002c:fixme:winediag:loader_init Please mention your exact version when filing bug reports on winehq.org.
Error: invalid string position!
其他几次调用macbinconv.exe
也因同样的错误而失败:
wine ~/.local/bin/macbinconv.exe -ad none MPW.rsrc -info md5
wine ~/.local/bin/macbinconv.exe -ad none MPW.rsrc -mb MPW.bin
wine ~/.local/bin/macbinconv.exe -dfrf none MPW.rsrc -mb md5
我现在想知道如何检查 StuffIt 提取是否unar
生成了真正有效的 AppleDouble 文件,其中的标头会欺骗 Unix FILE(1) 认为它是 AppleDouble,但编码不正确,并会将管道中的所有内容都抛出。但是,如果其他人知道如何生成有效的 AppleDouble 文件或将资源从其 AppleDouble 容器中分离出来并放入 MacBinary 文件中,那么我想我可以找出转换为 PCF 和 TTF 字体的剩余路径,然后我会在这里与其他人分享我是如何做到这一点的。
更新:安装StuffIt Expander 的 Windows 版本进入 WINE,然后针对.sit
文件运行它,生成子目录.rsrc
,并在其中有一个名为的文件MPW
。Unix FILE(1) 报告这是一个Mac OSX datafork font, 'NFNT', map offset 0x11b82, map length 0xb6, data length 0x11a82, at 16 0x00000c9a, nextResourceMap 0x31f77e8, fileRef 0x2690, list offset 0x1c, name offset 0xae, 6 types, 0x4e464e54 'NFNT' * 3 resource offset 0x32
。fondu
像这样运行会生成 BDF 和 TTF 文件,可以fontforge
顺利打开:
$ fondu -show MPW
Creating MPW-9.bdf
Creating MPW-10.bdf
Creating MPW-12.bdf
Creating MPW.ttf
我们现在知道至少有一种形式.sit
会unar
生成我们无法进一步转换的 AppleDouble 容器文件,并且当前模拟下的 StuffIt Expander 可以很好地生成适合字体转换的文件。