字符到字形映射表
Posted
技术标签:
【中文标题】字符到字形映射表【英文标题】:Character to Glyph mapping table 【发布时间】:2011-07-16 08:58:25 【问题描述】:我正在关注documentation on apple.com。
我设法得到The 'cmap' encoding subtables
。我 100% 知道 platformID, platformSpecificID
是正确的,但 offset
是可疑的。这是数据:
array(3)
[0]=>
array(3)
["platform_id"]=>
int(0)
["specific_id"]=>
int(3)
["offset"]=>
int(532)
[1]=>
array(3)
["platform_id"]=>
int(1)
["specific_id"]=>
int(0)
["offset"]=>
int(28)
[2]=>
array(3)
["platform_id"]=>
int(3)
["specific_id"]=>
int(1)
["offset"]=>
int(532)
两个表的偏移量相同,532
。谁能给我解释一下?这个偏移量是从当前位置还是从文件开头?
第 2 部分
好的。所以我设法使用这个到达format
表:
private function parseCmapTable($table)
$this->position = $table['offset'];
// http://developer.apple.com/fonts/ttrefman/RM06/Chap6cmap.html
// General table information
$data = array
(
'version' => $this->getUint16(),
'number_subtables' => $this->getUint16(),
);
$sub_tables = array();
for($i = 0; $i < $data['number_subtables']; $i++)
// http://developer.apple.com/fonts/ttrefman/RM06/Chap6cmap.html
// The 'cmap' encoding subtables
$sub_tables[] = array
(
'platform_id' => $this->getUint16(),
'specific_id' => $this->getUint16(),
'offset' => $this->getUint32(),
);
// http://developer.apple.com/fonts/ttrefman/RM06/Chap6cmap.html
// The 'cmap' formats
$formats = array();
foreach($sub_tables as $t)
// http://***.com/questions/5322019/character-to-glyph-mapping-table/5322267#5322267
$this->position = $table['offset'] + $t['offset'];
$format = array
(
'format' => $this->getUint16(),
'length' => $this->getUint16(),
'language' => $this->getUint16(),
);
if($format['format'] == 4)
$format += array
(
'seg_count_X2' => $this->getUint16(),
'search_range' => $this->getUint16(),
'entry_selector' => $this->getUint16(),
'range_shift' => $this->getUint16(),
'end_code[segCount]' => $this->getUint16(),
'reserved_pad' => $this->getUint16(),
'start_code[segCount]' => $this->getUint16(),
'id_delta[segCount]' => $this->getUint16(),
'id_range_offset[segCount]' => $this->getUint16(),
'glyph_index_array[variable]' => $this->getUint16(),
);
$backup = $format;
$format['seg_count_X2'] = $backup['seg_count_X2']*2;
$format['search_range'] = 2 * (2 * floor(log($backup['seg_count_X2'], 2)));
$format['entry_selector'] = log($backup['search_range']/2, 2);
$format['range_shift'] = (2 * $backup['seg_count_X2']) - $backup['search_range'];
$formats[$t['offset']] = $format;
die(var_dump( $sub_tables, $formats ));
输出:
array(3)
[0]=>
array(3)
["platform_id"]=>
int(0)
["specific_id"]=>
int(3)
["offset"]=>
int(532)
[1]=>
array(3)
["platform_id"]=>
int(1)
["specific_id"]=>
int(0)
["offset"]=>
int(28)
[2]=>
array(3)
["platform_id"]=>
int(3)
["specific_id"]=>
int(1)
["offset"]=>
int(532)
array(2)
[532]=>
array(13)
["format"]=>
int(4)
["length"]=>
int(658)
["language"]=>
int(0)
["seg_count_X2"]=>
int(192)
["search_range"]=>
float(24)
["entry_selector"]=>
float(5)
["range_shift"]=>
int(128)
["end_code[segCount]"]=>
int(48)
["reserved_pad"]=>
int(58)
["start_code[segCount]"]=>
int(64)
["id_delta[segCount]"]=>
int(69)
["id_range_offset[segCount]"]=>
int(70)
["glyph_index_array[variable]"]=>
int(90)
[28]=>
array(3)
["format"]=>
int(6)
["length"]=>
int(504)
["language"]=>
int(0)
现在,我如何从这里获取字符 Unicode 代码?我尝试阅读文档,但对于新手来说太模糊了。
http://developer.apple.com/fonts/ttrefman/RM06/Chap6cmap.html
【问题讨论】:
【参考方案1】:偏移量是从表格的开头。您的数据表明 Mac 表 (platformId 1) 从偏移量 28 开始,而 Unicode (platformId 0) 和 Windows (platformId 3) 映射共享从字节偏移量 532 开始的同一个表。
【讨论】:
谢谢加布。你似乎知道这些东西。你能看一下这个问题的第 2 部分吗? @Guy:与其把这个问题变成一个完全不同的问题,不如问第二个问题并发布彼此的链接。以上是关于字符到字形映射表的主要内容,如果未能解决你的问题,请参考以下文章