这是我用来构造表的数据:
{ version: { type: 'USHORT', value: 0 },
numTables: { type: 'USHORT', value: 1 },
platformID: { type: 'USHORT', value: 0 },
encodingID: { type: 'USHORT', value: 0 },
offset: { type: 'ULONG', value: 12 },
format: { type: 'USHORT', value: 0 },
length: { type: 'USHORT', value: 262 },
language: { type: 'USHORT', value: 0 },
glyphIdArray_0: { type: 'BYTE', value: 97 },
glyphIdArray_1: { type: 'BYTE', value: 98 },
glyphIdArray_2: { type: 'BYTE', value: 100 },
glyphIdArray_3: { type: 'BYTE', value: 0 },
glyphIdArray_4: { type: 'BYTE', value: 0 },
...
glyphIdArray_253: { type: 'BYTE', value: 0 },
glyphIdArray_254: { type: 'BYTE', value: 0 },
glyphIdArray_255: { type: 'BYTE', value: 0 } }
我玩过所有这些变量:
glyphIdArray
个项目的数量,从开头的3个字符到文档中指定的262个。在此示例中,format
为0,试图仅具有基本字体。
想知道format: 0
TrueType字体cmap表的正确格式是什么,或为什么它不起作用。
我正在查看的两个规格是Microsoft's和Apple's。
不确定this是否与它有关,无法真正解释这一点。
不确定cmap文档为什么说262长度而post docs说258。
我也尝试过:
$ ttfdump Regular.otf
True Type Font File Dumper: v 0.5.5
Copyright 1996-1998 ollie@ms1.hinet.net
Dumping File:Regular.otf
Offset Table
------------
sfnt version: 'true'
number of tables: 10
0. 'OS/2' - checksum = 0x00000000, offset = 0x000000ac, len = 100
1. 'cmap' - checksum = 0x00000000, offset = 0x00000110, len = 274
2. 'glyf' - checksum = 0x00000000, offset = 0x00000224, len = 87
3. 'head' - checksum = 0x00000000, offset = 0x0000027c, len = 54
4. 'hhea' - checksum = 0x00000000, offset = 0x000002b4, len = 36
5. 'hmtx' - checksum = 0x00000000, offset = 0x000002d8, len = 12
6. 'loca' - checksum = 0x00000000, offset = 0x000002e4, len = 16
7. 'maxp' - checksum = 0x00000000, offset = 0x000002f4, len = 32
8. 'name' - checksum = 0x00000000, offset = 0x00000314, len = 173
9. 'post' - checksum = 0x00000000, offset = 0x000003c4, len = 32
'cmap' Table - Character to Glyph Index Mapping Table
-----------------------------------------------------
'cmap' version: 0
number of encodings: 1
number of subtables: 1
Encoding 0. PlatformID: 0
EcodingID: 4
SubTable: 0, Offset: 0x0000000c
SubTable 0. Format 0 - Byte encoding table
Length: 256
Version: 0
Char 0 -> Index 0
Char 1 -> Index 0
Char 2 -> Index 0
Char 3 -> Index 98
Char 4 -> Index 98
Char 5 -> Index 98
Char 6 -> Index 98
Char 7 -> Index 98
Char 8 -> Index 98
Char 9 -> Index 98
Char 10 -> Index 98
Char 11 -> Index 98
Char 12 -> Index 98
Char 13 -> Index 98
Char 14 -> Index 98
Char 15 -> Index 98
Char 16 -> Index 98
Char 17 -> Index 98
Char 18 -> Index 98
Char 19 -> Index 98
Char 20 -> Index 98
Char 21 -> Index 98
Char 22 -> Index 98
Char 23 -> Index 98
Char 24 -> Index 98
Char 25 -> Index 98
Char 26 -> Index 98
Char 27 -> Index 98
Char 28 -> Index 98
Char 29 -> Index 98
Char 30 -> Index 98
Char 31 -> Index 98
Char 32 -> Index 98
Char 33 -> Index 98
Char 34 -> Index 98
Char 35 -> Index 98
Char 36 -> Index 98
Char 37 -> Index 98
Char 38 -> Index 98
Char 39 -> Index 98
Char 40 -> Index 98
Char 41 -> Index 98
Char 42 -> Index 98
Char 43 -> Index 98
Char 44 -> Index 98
Char 45 -> Index 98
Char 46 -> Index 98
Char 47 -> Index 98
Char 48 -> Index 98
Char 49 -> Index 98
Char 50 -> Index 98
Char 51 -> Index 98
Char 52 -> Index 98
Char 53 -> Index 98
Char 54 -> Index 98
Char 55 -> Index 98
Char 56 -> Index 98
Char 57 -> Index 98
Char 58 -> Index 98
Char 59 -> Index 98
Char 60 -> Index 98
Char 61 -> Index 98
Char 62 -> Index 98
Char 63 -> Index 98
Char 64 -> Index 98
Char 65 -> Index 98
Char 66 -> Index 98
Char 67 -> Index 98
Char 68 -> Index 98
Char 69 -> Index 98
Char 70 -> Index 98
Char 71 -> Index 98
Char 72 -> Index 98
Char 73 -> Index 98
Char 74 -> Index 98
Char 75 -> Index 98
Char 76 -> Index 98
Char 77 -> Index 98
Char 78 -> Index 98
Char 79 -> Index 98
Char 80 -> Index 98
Char 81 -> Index 98
Char 82 -> Index 98
Char 83 -> Index 98
Char 84 -> Index 98
Char 85 -> Index 98
Char 86 -> Index 98
Char 87 -> Index 98
Char 88 -> Index 98
Char 89 -> Index 98
Char 90 -> Index 98
Char 91 -> Index 98
Char 92 -> Index 98
Char 93 -> Index 98
Char 94 -> Index 98
Char 95 -> Index 98
Char 96 -> Index 98
Char 97 -> Index 98
Char 98 -> Index 98
Char 99 -> Index 98
Char 100 -> Index 98
Char 101 -> Index 98
Char 102 -> Index 98
Char 103 -> Index 98
Char 104 -> Index 98
Char 105 -> Index 98
Char 106 -> Index 98
Char 107 -> Index 98
Char 108 -> Index 98
Char 109 -> Index 98
Char 110 -> Index 98
Char 111 -> Index 98
Char 112 -> Index 98
Char 113 -> Index 98
Char 114 -> Index 98
Char 115 -> Index 98
Char 116 -> Index 98
Char 117 -> Index 98
Char 118 -> Index 98
Char 119 -> Index 98
Char 120 -> Index 98
Char 121 -> Index 98
Char 122 -> Index 98
Char 123 -> Index 98
Char 124 -> Index 98
Char 125 -> Index 98
Char 126 -> Index 98
Char 127 -> Index 98
Char 128 -> Index 98
Char 129 -> Index 98
Char 130 -> Index 98
Char 131 -> Index 98
Char 132 -> Index 98
Char 133 -> Index 98
Char 134 -> Index 98
Char 135 -> Index 98
Char 136 -> Index 98
Char 137 -> Index 98
Char 138 -> Index 98
Char 139 -> Index 98
Char 140 -> Index 98
Char 141 -> Index 98
Char 142 -> Index 98
Char 143 -> Index 98
Char 144 -> Index 98
Char 145 -> Index 98
Char 146 -> Index 98
Char 147 -> Index 98
Char 148 -> Index 98
Char 149 -> Index 98
Char 150 -> Index 98
Char 151 -> Index 98
Char 152 -> Index 98
Char 153 -> Index 98
Char 154 -> Index 98
Char 155 -> Index 98
Char 156 -> Index 98
Char 157 -> Index 98
Char 158 -> Index 98
Char 159 -> Index 98
Char 160 -> Index 98
Char 161 -> Index 98
Char 162 -> Index 98
Char 163 -> Index 98
Char 164 -> Index 98
Char 165 -> Index 98
Char 166 -> Index 98
Char 167 -> Index 98
Char 168 -> Index 98
Char 169 -> Index 98
Char 170 -> Index 98
Char 171 -> Index 98
Char 172 -> Index 98
Char 173 -> Index 98
Char 174 -> Index 98
Char 175 -> Index 98
Char 176 -> Index 98
Char 177 -> Index 98
Char 178 -> Index 98
Char 179 -> Index 98
Char 180 -> Index 98
Char 181 -> Index 98
Char 182 -> Index 98
Char 183 -> Index 98
Char 184 -> Index 98
Char 185 -> Index 98
Char 186 -> Index 98
Char 187 -> Index 98
Char 188 -> Index 98
Char 189 -> Index 98
Char 190 -> Index 98
Char 191 -> Index 98
Char 192 -> Index 98
Char 193 -> Index 98
Char 194 -> Index 98
Char 195 -> Index 98
Char 196 -> Index 98
Char 197 -> Index 98
Char 198 -> Index 98
Char 199 -> Index 98
Char 200 -> Index 98
Char 201 -> Index 98
Char 202 -> Index 98
Char 203 -> Index 98
Char 204 -> Index 98
Char 205 -> Index 98
Char 206 -> Index 98
Char 207 -> Index 98
Char 208 -> Index 98
Char 209 -> Index 98
Char 210 -> Index 98
Char 211 -> Index 98
Char 212 -> Index 98
Char 213 -> Index 98
Char 214 -> Index 98
Char 215 -> Index 98
Char 216 -> Index 98
Char 217 -> Index 98
Char 218 -> Index 98
Char 219 -> Index 98
Char 220 -> Index 98
Char 221 -> Index 98
Char 222 -> Index 98
Char 223 -> Index 98
Char 224 -> Index 98
Char 225 -> Index 98
Char 226 -> Index 98
Char 227 -> Index 98
Char 228 -> Index 98
Char 229 -> Index 98
Char 230 -> Index 98
Char 231 -> Index 98
Char 232 -> Index 98
Char 233 -> Index 98
Char 234 -> Index 98
Char 235 -> Index 98
Char 236 -> Index 98
Char 237 -> Index 98
Char 238 -> Index 98
Char 239 -> Index 98
Char 240 -> Index 98
Char 241 -> Index 98
Char 242 -> Index 98
Char 243 -> Index 98
Char 244 -> Index 98
Char 245 -> Index 98
Char 246 -> Index 98
Char 247 -> Index 98
Char 248 -> Index 98
Char 249 -> Index 98
Char 250 -> Index 98
Char 251 -> Index 98
Char 252 -> Index 98
Char 253 -> Index 98
Char 254 -> Index 98
Char 255 -> Index 98
'head' Table - Font Header
--------------------------
'head' version: 1.0
fontReversion: 1.4352
checkSumAdjustment: 0x00000000
magicNumber: 0x5f0f3cf5
flags: 0x0003
unitsPerEm: 2048
created: 0x00000000d86cebf5
modified: 0x00000000d86cebf5
xMin: 10
yMin: 10
xMax: 90
yMax: 90
macStyle bits: 0x0000
lowestRecPPEM: 3
fontDirectionHint: 2
indexToLocFormat: 1
glyphDataFormat: 0
'hhea' Table - Horizontal Header
--------------------------
'hhea' version: 1.0
yAscender: 200
yDescender: 100
yLineGap: 0
advanceWidthMax: 90
minLeftSideBearing: 0
minRightSideBearing: 10
xMaxExtent: 80
caretSlopeRise: 1
caretSlopeRun: 0
reserved0: 0
reserved1: 0
reserved2: 0
reserved3: 0
reserved4: 0
metricDataFormat: 0
numberOfHMetrics: 3
'hmtx' Table - Horizontal Metrics
---------------------------------
0. advWid: 90, LSBear: 10
1. advWid: 90, LSBear: 10
2. advWid: 90, LSBear: 10
'loca' Table - Index to Location
--------------------------------
Idx 0 -> GlyphOffset 0x00000000
Idx 1 -> GlyphOffset 0x0000001d
Idx 2 -> GlyphOffset 0x0000003a
Ended at 0x00000057
'maxp' Table - Maximum Profile
------------------------------
'maxp' version: 1.0
numGlyphs: 3
maxPoints: 5
maxContours: 1
maxCompositePoints: 0
maxCompositeContours: 0
maxZones: 1
maxTwilightPoints: 0
maxStorage: 0
maxFunctionDefs: 0
maxInstructionDefs: 0
maxStackElements: 0
maxSizeOfInstructions: 0
maxComponentElements: 0
maxCompoenetDepth: 0
'name' Table - Naming Table
---------------------------
Format: 0
Number of Record: 7
Storage offset: 90
Name table 0. PlatformID: 1
EncodingID: 0
LanguageID: 0
NameID: 6
Length: 3
Offset: 0
46 6f 6f > Foo
Name table 1. PlatformID: 1
EncodingID: 0
LanguageID: 0
NameID: 1
Length: 3
Offset: 0
46 6f 6f > Foo
Name table 2. PlatformID: 1
EncodingID: 0
LanguageID: 0
NameID: 2
Length: 7
Offset: 3
52 65 67 75 6c 61 72 > Regular
Name table 3. PlatformID: 1
EncodingID: 0
LanguageID: 0
NameID: 3
Length: 3
Offset: 10
66 6f 6f > foo
Name table 4. PlatformID: 1
EncodingID: 0
LanguageID: 0
NameID: 4
Length: 11
Offset: 13
46 6f 6f 20 52 65 67 75 6c 61 > Foo Regula
72 > r
Name table 5. PlatformID: 1
EncodingID: 0
LanguageID: 0
NameID: 13
Length: 46
Offset: 24
4c 69 63 65 6e 73 65 64 20 75 > Licensed u
6e 64 65 72 20 74 68 65 20 41 > nder the A
70 61 63 68 65 20 4c 69 63 65 > pache Lice
6e 73 65 2c 20 56 65 72 73 69 > nse, Versi
6f 6e 20 32 2e 30 > on 2.0
Name table 6. PlatformID: 1
EncodingID: 0
LanguageID: 0
NameID: 5
Length: 13
Offset: 70
56 65 72 73 69 6f 6e 20 31 2e > Version 1.
30 30 30 > 000
'post' Table - PostScript
-------------------------
'post' format: 1.0
italicAngle: 0.0
underlinePosition: 0
underlineThichness: 0
isFixedPitch: 1d
minMemType42: 0d
maxMemType42: 0d
minMemType1: 0d
maxMemType1: 0d
'OS/2' Table - OS/2 and Windows Metrics
---------------------------------------
'OS/2' version: 5
xAvgCharWidth: 90
usWeightClass: 500 'Medium'
usWidthClass: 5 'Medium'
fsType: 0
ySubscriptXSize: 650
ySubscriptYSize: 699
ySubscriptXOffset: 0
ySubscriptYOffset: 140
ySuperscriptXSize: 650
ySuperscriptYSize: 699
ySuperscriptXOffset: 0
ySuperscriptYOffset: 479
yStrikeoutSize: 49
yStrikeoutPosition 258
sFamilyClass: 0 subclass = 0
PANOSE:
Family Kind: 0 'Any'
Serif Style: 0 'Any'
Weight: 0 'Any'
Proportion: 9 'Monospaced'
Contrast: 0 'Any'
Stroke: 0 'Any'
Arm Style: 0 'Any'
Lettreform: 0 'Any'
Midline: 0 'Any'
X-height: 0 'Any'
Unicode Range 1( Bits 0 - 31 ): 0x00000000
Unicode Range 2( Bits 32 - 63 ): 0x00000000
Unicode Range 3( Bits 64 - 95 ): 0x00000000
Unicode Range 4( Bits 96 - 128 ): 0x00000000
achVendID: 'XXXX'
fsSelection: 0x0040 'Regular '
usFirstCharIndex: 0x0061
usLastCharIndex: 0x0064
sTypoAscender: 200
sTypoDescender: 100
sTypoLineGap: 0
usWinAscent: 90
usWinDescent: 10
CodePage Range 1( Bits 0 - 31 ): 0x00000001
CodePage Range 2( Bits 32- 63 ): 0x00000000
sxHeight: 100
sCapHeight: 40
usDefaultChar: 0x0000
usBreakChar: 0x0000
usMaxContext: 0
Glyph 0.
numberOfContours: 1
xMin: 10
yMin: 10
xMax: 90
yMax: 90
EndPoints
---------
0: 4
Length of Instructions: 0
Flags
-----
0: YDual XDual Y-Short X-Short On
1: YDual XDual Y-Short X-Short On
2: YDual XDual Y-Short X-Short On
3: YDual Y-Short X-Short On
4: XDual Y-Short X-Short On
Coordinates
-----------
0 Rel ( 10, 10) -> Abs ( 10, 10)
1 Rel ( 80, 0) -> Abs ( 90, 10)
2 Rel ( 0, 80) -> Abs ( 90, 90)
3 Rel ( -80, 0) -> Abs ( 10, 90)
4 Rel ( 0, -80) -> Abs ( 10, 10)
Glyph 1.
numberOfContours: 1
xMin: 10
yMin: 10
xMax: 90
yMax: 90
EndPoints
---------
0: 4
Length of Instructions: 0
Flags
-----
0: YDual XDual Y-Short X-Short On
1: YDual XDual Y-Short X-Short On
2: YDual XDual Y-Short X-Short On
3: YDual Y-Short X-Short On
4: XDual Y-Short X-Short On
Coordinates
-----------
0 Rel ( 10, 10) -> Abs ( 10, 10)
1 Rel ( 80, 0) -> Abs ( 90, 10)
2 Rel ( 0, 80) -> Abs ( 90, 90)
3 Rel ( -80, 0) -> Abs ( 10, 90)
4 Rel ( 0, -80) -> Abs ( 10, 10)
Glyph 2.
numberOfContours: 1
xMin: 10
yMin: 10
xMax: 90
yMax: 90
EndPoints
---------
0: 4
Length of Instructions: 0
Flags
-----
0: YDual XDual Y-Short X-Short On
1: YDual XDual Y-Short X-Short On
2: YDual XDual Y-Short X-Short On
3: YDual Y-Short X-Short On
4: XDual Y-Short X-Short On
Coordinates
-----------
0 Rel ( 10, 10) -> Abs ( 10, 10)
1 Rel ( 80, 0) -> Abs ( 90, 10)
2 Rel ( 0, 80) -> Abs ( 90, 90)
3 Rel ( -80, 0) -> Abs ( 10, 90)
4 Rel ( 0, -80) -> Abs ( 10, 10)
但是在Chrome浏览器中仍然如此:
OTS parsing error: cmap: Failed to serialize table
OTS似乎由于某种未知原因而失败:
>> com.google.fonts/check/036 with (('font[0]', 'Regular.otf'),)
Checking with ots-sanitize.
* FAIL: ots-sanitize returned an error code (1). Output follows:
WARNING: bad search range
WARNING: bad range shift
WARNING: name: name records are not sorted.
WARNING: name: name records are not sorted.
ERROR: cmap: no supported subtables were found
ERROR: cmap: Failed to serialize table
Failed to sanitize file!
但是ttfdump
和ttx
都可以正常工作。
<cmap>
<tableVersion version="0"/>
<cmap_format_4 platformID="3" platEncID="1" language="0">
<map code="0x62" name=".null"/><!-- LATIN SMALL LETTER B -->
<map code="0x64" name="nonmarkingreturn"/><!-- LATIN SMALL LETTER D -->
</cmap_format_4>
</cmap>
也许this会有所帮助。
答案 0 :(得分:0)
貌似使用OTS的Chrome浏览器不支持格式0。
// We only support a subset of the possible character map tables. Microsoft
// 'strongly recommends' that everyone supports the Unicode BMP table with
// the UCS-4 table for non-BMP glyphs. We'll pass the following subtables:
// Platform ID Encoding ID Format
// 0 0 4 (Unicode Default)
// 0 1 4 (Unicode 1.1)
// 0 3 4 (Unicode BMP)
// 0 3 12 (Unicode UCS-4)
// 0 5 14 (Unicode Variation Sequences)
// 1 0 0 (Mac Roman)
// 3 0 4 (MS Symbol)
// 3 1 4 (MS Unicode BMP)
// 3 10 12 (MS Unicode UCS-4)
// 3 10 13 (MS UCS-4 Fallback mapping)
//
// Note:
// * 0-0-4 and 0-1-4 tables are (usually) written as a 3-1-4 table. If 3-1-4 table
// also exists, the 0-0-4 or 0-1-4 tables are ignored.
// * Unlike 0-0-4 table, 0-3-4 table is written as a 0-3-4 table.
// Some fonts which include 0-5-14 table seems to be required 0-3-4
// table. The 0-3-4 table will be wriiten even if 3-1-4 table also exists.
// * 0-3-12 table is written as a 3-10-12 table. If 3-10-12 table also
// exists, the 0-3-12 table is ignored.
//
https://chromium.googlesource.com/external/ots/+/master/src/cmap.cc#728