字符到字形映射表

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:与其把这个问题变成一个完全不同的问题,不如问第二个问题并发布彼此的链接。

以上是关于字符到字形映射表的主要内容,如果未能解决你的问题,请参考以下文章

如何为 OpenGL 文本渲染计算字符映射中的最佳字形边界

是否有“未找到字形”字符?

用于表示组合字符的 unicode 字形是啥?

正则表达式速查表

正则表达式速查表

编码表字节流字节缓冲流