OTS 解析错误:无法从字体数据中实例化字体
Posted
技术标签:
【中文标题】OTS 解析错误:无法从字体数据中实例化字体【英文标题】:OTS parsing error: Unable to instantiate font face from font data 【发布时间】:2019-06-12 11:04:50 【问题描述】:我将这些数据用于计算我的cmap
表:
version: type: 'USHORT', value: 0 ,
numTables: type: 'USHORT', value: 1 ,
platformID: type: 'USHORT', value: 0 ,
encodingID: type: 'USHORT', value: 6 ,
offset: type: 'ULONG', value: 12 ,
format: type: 'USHORT', value: 4 ,
cmap4Length: type: 'USHORT', value: 34 ,
language: type: 'USHORT', value: 0 ,
segCountX2: type: 'USHORT', value: 4 ,
searchRange: type: 'USHORT', value: 4 ,
entrySelector: type: 'USHORT', value: 1 ,
rangeShift: type: 'USHORT', value: 0 ,
end_0: type: 'USHORT', value: 97 ,
end_1: type: 'USHORT', value: 65535 ,
reservedPad: type: 'USHORT', value: 0 ,
start_0: type: 'USHORT', value: 97 ,
start_1: type: 'USHORT', value: 65535 ,
idDelta_0: type: 'SHORT', value: -97 ,
idDelta_1: type: 'SHORT', value: 1 ,
idRangeOffset_0: type: 'USHORT', value: 0 ,
idRangeOffset_1: type: 'USHORT', value: 0 ,
glyph_0: type: 'USHORT', value: 0
生成的整体字体文件是这样的:
00000000: 4f54 544f 0009 0008 0003 0001 4346 4632 OTTO........CFF2
00000010: 0000 0000 0000 009c 0000 0055 636d 6170 ...........Ucmap
00000020: 0000 0000 0000 00f4 0000 002e 6865 6164 ............head
00000030: 0000 0000 0000 0124 0000 0036 6868 6561 .......$...6hhea
00000040: 0000 0000 0000 015c 0000 0024 686d 7478 .......\...$hmtx
00000050: 0000 0000 0000 0180 0000 0004 6d61 7870 ............maxp
00000060: 0000 0000 0000 0184 0000 0006 6e61 6d65 ............name
00000070: 0000 0000 0000 018c 0000 0006 4f53 2f32 ............OS/2
00000080: 0000 0000 0000 0194 0000 0064 706f 7374 ...........dpost
00000090: 0000 0000 0000 01f8 0000 0020 0200 0500 ........... ....
^ ^ ^ ^
| | | |__________________ 0
| | |____________________ 5
| |_______________________ 0
|_________________________ 2 (start of CFF table)
000000a0: 171e 0a00 1f1e 0f1e 0f1e 0a00 1f1e 0f1e ................
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | | | | | | | |__________________ 30
| | | | | | | | | | | | | | |____________________ 15
| | | | | | | | | | | | | |_______________________ 30
| | | | | | | | | | | | |_________________________ 31
| | | | | | | | | | | |____________________________ 0
| | | | | | | | | | |______________________________ 10
| | | | | | | | | |_________________________________ 30
| | | | | | | | |___________________________________ 15
| | | | | | | |______________________________________ 30
| | | | | | |________________________________________ 15
| | | | | |___________________________________________ 30
| | | | |_____________________________________________ 31
| | | |________________________________________________ 0
| | |__________________________________________________ 10
| |_____________________________________________________ 30 /cff2/header/fontmatrix
|_______________________________________________________ 23
000000b0: 0f0c 07aa 11cd 0c24 a818 da0c 2500 0000 .......$....%...
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | | | | | | | |__________________ 0
| | | | | | | | | | | | | | |____________________ 0
| | | | | | | | | | | | | |_______________________ 0 /globalsubr count32
| | | | | | | | | | | | |_________________________ 37 = op2 \cff2\header
| | | | | | | | | | | |____________________________ 12 = op1
| | | | | | | | | | |______________________________ 218 = 139 + 79
| | | | | | | | | |_________________________________ 24 = op
| | | | | | | | |___________________________________ 168 = 139 + 29
| | | | | | | |______________________________________ 36 = op2
| | | | | | |________________________________________ 12 = op1
| | | | | |___________________________________________ 205 = 139 + 66
| | | | |_____________________________________________ 17 = op
| | | |________________________________________________ 170 = 139 + 31
| | |__________________________________________________ 7 \cff2\header\fontmatrix
| |_____________________________________________________ 12
|_______________________________________________________ 15
000000c0: 0000 0000 0000 0101 011d 95f7 3405 8b77 ............4..w
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | | | | | | | |__________________ 119 = 139 - 20
| | | | | | | | | | | | | | |____________________ 139 = 0
| | | | | | | | | | | | | |_______________________ 5 = op 5
| | | | | | | | | | | | |_________________________ 52 = 160 - 108
| | | | | | | | | | | |____________________________ 247 = int2
| | | | | | | | | | |______________________________ 149 = 139 + 10
| | | | | | | | | |_________________________________ 29 offset
| | | | | | | | |___________________________________ 1 /charstring offsets
| | | | | | | |______________________________________ 1 /charstring offSize
| | | | | | |________________________________________ 1
| | | | | |___________________________________________ 0
| | | | |_____________________________________________ 0
| | | |________________________________________________ 0 /charstring count
| | |__________________________________________________ 0
| |_____________________________________________________ 0 /vstore length16
|_______________________________________________________ 0
000000d0: 15db 9f05 3b8b 05db 8b15 3b77 058b c715 ....;.....;w....
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | | | | | | | |__________________ 21 = op 21
| | | | | | | | | | | | | | |____________________ 199 = 139 + 60
| | | | | | | | | | | | | |_______________________ 139 = 139
| | | | | | | | | | | | |_________________________ 5 = op 5
| | | | | | | | | | | |____________________________ 119 = 139 - 20
| | | | | | | | | | |______________________________ 59 = 139 - 80
| | | | | | | | | |_________________________________ 21 = op 21
| | | | | | | | |___________________________________ 139 = 139
| | | | | | | |______________________________________ 219 = 139 + 80
| | | | | | |________________________________________ 5 = op 5
| | | | | |___________________________________________ 139 = 139
| | | | |_____________________________________________ 59 = 139 - 80
| | | |________________________________________________ 5 = op 5
| | |__________________________________________________ 159 = 139 + 20
| |_____________________________________________________ 219 = 139 + 80
|_______________________________________________________ 21 = op 21
000000e0: db4f 058b c715 0000 0001 0101 048b 8b12 .O..............
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | | | | | | | |__________________ 18 = op
| | | | | | | | | | | | | | |____________________ 139 = 0
| | | | | | | | | | | | | |_______________________ 139 = 0
| | | | | | | | | | | | |_________________________ 4 /fontindex offsets
| | | | | | | | | | | |____________________________ 1 /fontindex offsets
| | | | | | | | | | |______________________________ 1 /fontindex offsize
| | | | | | | | | |_________________________________ 1
| | | | | | | | |___________________________________ 0
| | | | | | | |______________________________________ 0
| | | | | | |________________________________________ 0 /fontindex count
| | | | | |___________________________________________ 21 = op 21 /charstring
| | | | |_____________________________________________ 199 = 139 + 60
| | | |________________________________________________ 139 = 139
| | |__________________________________________________ 5 = op 5
| |_____________________________________________________ 79 = 139 - 60
|_______________________________________________________ 219 = 139 + 80
000000f0: 0000 0000 0000 0001 0000 0006 0000 000c ................
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | | | | | | | |__________________ 12
| | | | | | | | | | | | | | |____________________ 0
| | | | | | | | | | | | | |_______________________ 0
| | | | | | | | | | | | |_________________________ 0 /offset
| | | | | | | | | | | |____________________________ 6
| | | | | | | | | | |______________________________ 0 /encodingID
| | | | | | | | | |_________________________________ 0
| | | | | | | | |___________________________________ 0 /platformID
| | | | | | | |______________________________________ 1
| | | | | | |________________________________________ 0 /numTables
| | | | | |___________________________________________ 0
| | | | |_____________________________________________ 0 /version
| | | |________________________________________________ 0
| | |__________________________________________________ 0
| |_____________________________________________________ 0
|_______________________________________________________ 0
00000100: 0004 0022 0000 0004 0004 0001 0000 0061 ..."...........a
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | | | | | | | |__________________ 97
| | | | | | | | | | | | | | |____________________ 0 /end_0
| | | | | | | | | | | | | |_______________________ 0
| | | | | | | | | | | | |_________________________ 0 /rangeShift
| | | | | | | | | | | |____________________________ 1
| | | | | | | | | | |______________________________ 0 /entrySelector
| | | | | | | | | |_________________________________ 4
| | | | | | | | |___________________________________ 0 /searchRange
| | | | | | | |______________________________________ 4
| | | | | | |________________________________________ 0 /segCountX2
| | | | | |___________________________________________ 0
| | | | |_____________________________________________ 0 /language
| | | |________________________________________________ 34
| | |__________________________________________________ 0 /cmap4length
| |_____________________________________________________ 4
|_______________________________________________________ 0 /format
00000110: ffff 0000 0061 ffff ff9f 0001 0000 0000 .....a..........
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | | | | | | | |__________________ 0
| | | | | | | | | | | | | | |____________________ 0 /idRangeOffset_1
| | | | | | | | | | | | | |_______________________ 0
| | | | | | | | | | | | |_________________________ 0 /idRangeOffset_0
| | | | | | | | | | | |____________________________ 1
| | | | | | | | | | |______________________________ 0 /delta_1
| | | | | | | | | |_________________________________ 159
| | | | | | | | |___________________________________ 255 /delta_0
| | | | | | | |______________________________________ 255
| | | | | | |________________________________________ 255 /start_1
| | | | | |___________________________________________ 97
| | | | |_____________________________________________ 0 /start_0
| | | |________________________________________________ 0
| | |__________________________________________________ 0 /reservePad
| |_____________________________________________________ 255
|_______________________________________________________ 255 /end_1
00000120: 0000 0000 0001 0000 0001 0000 0000 0000 ................
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | | | | | | | |__________________ 0
| | | | | | | | | | | | | | |____________________ 0
| | | | | | | | | | | | | |_______________________ 0
| | | | | | | | | | | | |_________________________ 0
| | | | | | | | | | | |____________________________ 0
| | | | | | | | | | |______________________________ 0
| | | | | | | | | |_________________________________ 1
| | | | | | | | |___________________________________ 0
| | | | | | | |______________________________________ 0
| | | | | | |________________________________________ 0
| | | | | |___________________________________________ 1
| | | | |_____________________________________________ 0
| | | |________________________________________________ 0
| | |__________________________________________________ 0 \cmap
| |_____________________________________________________ 0
|_______________________________________________________ 0 /glyph_0
00000130: 5f0f 3cf5 0003 03e8 0000 0000 d867 5bd6 _.<..........g[.
00000140: 0000 0000 d867 5bd6 0000 0000 005a 0000 .....g[......Z..
00000150: 0000 0003 0002 0000 0000 0000 0001 0000 ................
00000160: 00c8 0064 0000 005a 0000 0000 0000 0001 ...d...Z........
00000170: 0000 0000 0000 0000 0000 0000 0000 0001 ................
00000180: 005a 0000 0000 5000 0001 0000 0000 0000 .Z....P.........
00000190: 0006 0000 0005 0000 0000 0000 0000 028a ................
000001a0: 02bb 0000 008c 028a 02bb 0000 01df 0031 ...............1
000001b0: 0102 0000 0000 0000 0000 0000 0000 0000 ................
000001c0: 0000 0000 0000 0000 0000 0000 0000 5858 ..............XX
000001d0: 5858 0000 0000 0000 0000 0000 0000 0000 XX..............
000001e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000001f0: 0000 0000 0000 0000 0003 0000 0000 0000 ................
00000200: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000210: 0000 0000 0000 0000 ........
想知道如果在第一个 JSON 中,一切看起来都不错/符合规范。我基本上只是连接来自该 JSON 的十进制值,然后将其放入缓冲区并将其写入文件,因此如果准确,则最终结果应该是准确的。
不确定 255 的值是否正确,否则我看不到任何会使其不正确的东西。想知道你是否能找到任何东西。
如果我在某些地方稍作改动,那么我会得到:
OTS parsing error: cmap: Failed to parse table
否则得到:
OTS parsing error: cmap: Failed to serialize table
不确定哪个离工作更近或更远。
如果我改变这两个:
platformID: type: 'USHORT', value: 3 ,
encodingID: type: 'USHORT', value: 1 ,
我明白了:
OTS parsing error: Unable to instantiate font face from font data.
【问题讨论】:
您可能需要解释您是如何制作字体的(您显示的许多值是计算值,而不是您需要自己写出的值),以及如何您正在运行 OTS,但除此之外,我强烈建议您使用 TTX 构建类似的 CFF2 并查看它与您提出的不同之处。 【参考方案1】:这是一个非常普遍的错误,包含许多子错误。更多信息可以通过fontbakery 或Mac Font Validator 找到,它们提供的信息略有不同。还有其他项目,例如 Microsoft Font Validator 和 OTS,但这些项目提供了显着的调试改进。
仍未解决整体问题,但了解更好的错误消息有助于重新构建问题。
【讨论】:
以上是关于OTS 解析错误:无法从字体数据中实例化字体的主要内容,如果未能解决你的问题,请参考以下文章
自托管 Google 的 Material Design 图标字体 - OTS 解析错误 - 无效的版本标签