字符到字形映射表

2023-12-08

我正在关注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。谁能给我解释一下吗?这是从当前位置还是从文件开头的偏移量?

part 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://stackoverflow.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


偏移量是从表的开头。您的数据表明 Mac 表 (platformId 1) 从偏移量 28 开始,而 Unicode (platformId 0) 和 Windows (platformId 3) 映射共享从字节偏移量 532 开始的同一个表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符到字形映射表 的相关文章

  • PHP 中的多个插入查询[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个 php html 表单 它将结果插入到狗展数据库中 问题是 无论我做什么 我都会收到此错误 查询失败 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在 INSE
  • Doctrine DQL 从 join 返回平面数组

    我通过 DQL 中的常规 LEFT JOIN 选择 3 个实体 它们通过连接表关联 连接表还定义了实体以及带注释的关系 查询执行没有问题 但我的结果作为平面数组返回 我期望一个包含三个实体作为每个索引的数组元素的数组 SELECT e1 e
  • PDO语法错误

    我在一个项目中使用 PDO 但提交时出现语法错误 这是我的代码
  • 使用“INSERT ... ON DUPLICATE KEY UPDATE”插入多条记录

    我的表结构 table marks 我的目标 我想用条件插入或更新多条记录 我目前正在通过此查询进行检查 第一步 SELECT FROM marks WHERE student 115 AND param 1 第二步 if records
  • 如何仅删除页面的自动段落格式,而不删除帖子的自动段落格式(WordPress)

    我已经熟悉这个在 WordPress 中删除自动段落格式的小技巧 remove filter the content wpautop remove filter the excerpt wpautop 但是添加这个函数 php删除整个网站的
  • 发送变量后的 wsdl 服务响应,php

    我是 SOAP WSDL 函数的新手 我有一位客户从一家从事汽车测试的公司获得了 wsdl 文件 我的客户是他们的分包商 他们告诉我们上传有关车牌 类别等信息 一旦详细信息发送完毕 服务器就会做出成功或失败的响应 请您协助 浏览不同的信息
  • 如何在 CakePHP 中“验证”人名?

    我有一个 PHP 脚本 应该检查 有效 的人名 但最近破解了带有空格的名称 因此我们向验证器添加了空格 除了这样做之外 有没有办法向 CakePHP 的验证器添加黑名单以阻止所有 无效 字符 而不是允许 有效 字符 注意 我 通常 知道如何
  • xdebug.remote_handler 在 PHP.INI 中设置,但未在 PHPinfo 中显示

    我正在尝试让 Xbdebug 与 NetBeans 一起运行 以便调试一些 PHP 代码 我确信几年前我已经让它工作了 然后切换了 IDE 现在想切换回来 When I try to debug the status bar shows 并
  • 自定义帖子类型的 WordPress 自定义字段

    过去有几个人出现过这个问题 但他们的问题的解决方案对我来说不起作用 我已经尝试了很多 在 WordPress 中 我创建了 3 种自定义帖子类型 1 代表 视频 新闻 和 音乐 每个内容都发布到自己的页面 我想添加自定义字段 这样我就可以为
  • Zend Framework 中的动态默认模块

    有谁知道在 Zend Framework 中动态设置默认模块并且不会遇到命名空间问题的方法 例如 我想要做的是有一个允许加载的模块表 其中一个设置为默认模块 例如 我可能有 admin blog calendar 作为可以加载的模块 如果我
  • 纯基于网络的版本控制系统

    我的托管服务当前不允许在其服务器上运行 允许 svn git cvs 我真的希望能够将我的开发计算机上的当前源代码与我的生产服务器 同步 我正在寻找一个纯php python ruby版本控制系统 不只是一个client对于版本控制系统 不
  • 将IP保存到数据库中

    当用户登录时 我想将他们的 IP 保存在数据库中 我该怎么做呢 MySQL 字段最适合使用哪种类型 获取IP的PHP代码是什么样的 我正在考虑将其用作登录 会话内容的额外安全功能 我正在考虑使用用户现在拥有的 IP 检查用户从数据库登录的
  • 从 php 执行 bash 脚本并立即输出回网页

    我有一组 bash 和 Perl 脚本 开发在 Linux Box 上部署所需的目录结构 可选 从svn导出代码 从这个源构建一个包 这在终端上运行良好 现在 我的客户请求此流程的 Web 界面 例如 某些页面上的 创建新包 按钮将一一调用
  • json_encode 返回 NULL?

    由于某种原因 项目 描述 返回NULL使用以下代码 这是我的数据库的架构 CREATE TABLE staff id int 11 NOT NULL AUTO INCREMENT name longtext COLL
  • Laravel 登录后重定向回来

    登录后如何重定向返回页面 在 Laravel 5 2 中 认证控制器 protected redirectTo 重定向用户
  • 合并 2 个数组并合并数字键的结果

    我有 2 个数组 我希望通过每个数字键将其中合并 分组在一起 例如 Array1 2009 gt 131 2008 gt 940 2007 gt 176 2006 gt 1 Array2 2008 gt 9 2007 gt 3 我希望输出是
  • 扩展构建器中的“映射到现有表”显示 TYPO3 中的奇怪问题

    在我的扩展中MyExt 我映射了模型Page to pagesTYPO3 中的表 首先它向我展示了type mismatch错误 无论如何我继续保存它 会发生以下情况 我的页面树变成这样 我的新记录表单仅显示 UID 而不显示标题 My P
  • PHP 中的encodeURI() ?

    PHP 中是否有一些不编码的encodeURI 函数 我现在用这个 function encodeURI url http php net manual en function rawurlencode php https develope
  • 通过身份验证保护 CodeIgniter 2 应用程序的正确方法是什么?

    I have Ion Auth http benedmunds com ion auth 正确安装并在我的服务器上运行 我也有默认的代码点火器2 新闻 教程在同一个 CI 安装中工作 我只是在玩 并对使用身份验证系统 封闭 或保护整个应用程
  • 为什么这评估为 true

    为什么这评估结果为真

随机推荐

  • Java:将两个json对象与主键合并在一起

    假设内存中有两个 JSONObject 数组 每个对象都有一个在两个数组中相似的键 Array 1 name Big Melons Co location Inner City Dubai id 1A name Pear Flavored
  • Jenkins - 如何构建特定分支

    这并不像仅仅进行参数化构建那么简单 我已经有了一个特定的构建过程 每当这些分支被推送到 GitHub 时就会构建和部署 所以如果我刚刚推动develop它构建成功 我如何触发手动构建并将其拉出feature my new feature 不
  • 检查字符串中是否有坏词? [复制]

    这个问题在这里已经有答案了 可能的重复 测试字符串中某些单词的有效方法 我想检查一个字符串是否包含以下任何单词 禁令 不良 用户 通行证 堆栈 名称 html 如果它包含任何单词 我需要回显坏单词的数量 str Hello my name
  • 阻止 Tumblr 将 JS 和 CSS 文件添加到主题中

    Tumblr 的博客中充斥着大量的 JS 和 CSS 文件 我不知道这些文件是否是必需的或只是有用 这是其中的列表 JS tumblelog js 和 pre tumblelog js gt 看起来这是 Tumblr JS API 但我们需
  • 如何停止 Swing 中重复的 keyPressed() / keyReleased() 事件

    所以我遇到的问题似乎是仅在 Linux 上发生的错误 我试图让我的摇摆应用程序记录按下某个键的时间 然后检测该键何时被释放 现在这不应该成为问题 因为按键监听器应该为我处理这个问题 问题是 当我按住按键时 我会收到大量重复的 keyPres
  • 如何在元组中单独添加元素?

    如何在元组中单独添加元素 例如 我需要 2 4 from 0 1 2 3 我一直这样做 但是有没有更Pythonic 更简洁的方法来做同样的事情 gt gt gt x 0 1 gt gt gt y 2 3 gt gt gt x y 0 1
  • SQLite:sqlite3.dll 与 System.Data.SQLite.dll?

    我需要使用什么SQLite 与 NHibernate and FluentNHibernate 有 系统 Data SQLite dll and 系统 Data SQLite Linq dll ADO NET 2 0 提供程序 可从http
  • Angular2 使用标签更新 ng2-charts

    这些天我开始工作Angular2 并对框架有疑问ng2 图表 这是我的组件 ts code import Component from angular core import ChartsModule from ng2 charts imp
  • std::numeric_limits 作为条件

    有什么方法我可以使用std numeric limits
  • 通过 extravars 将主机名传递给 ansible playbook

    我必须通过额外的变量传递将在其上执行 Ansible 命令的主机 我事先不知道任务将应用到哪些主机 因此 我的清单文件当前缺少hosts 多变的 如果我从文章中理解 如何将额外变量传递给 Ansible playbook 正确地说 只有已经
  • 共享元素过渡 + Fragment + RecyclerView + ViewPager

    我正在实现一个图库应用程序 它有一个片段 其中包含带有图像的 RecyclerView 单击图像时我会转到 ViewPager 循环浏览图像 现在 我正在尝试仅实现入口动画 如this视频 问题是动画不起作用 我显然错过了一些东西 只是显示
  • 异常如何转移并找到处理程序?

    当引发异常时 将启动堆栈展开 直到遇到处理代码 但我对整个过程的机制有点不清楚 1 异常存储在哪里 我并不是指实际的异常对象 它可能很大 例如有一个消息字符串或其他东西 但如果您愿意的话 也可以是实际的引用或指针 它必须是某个统一的存储位置
  • Xcode 4 数据模型版本控制错误?

    安装了 Xcode 4 一切似乎都很好 除了 当我尝试向核心数据模型添加版本控制时 在说明中 它说我应该在导航器中选择数据模型 然后 选择编辑器 gt 转换为版本化模型 好吧 编辑器 菜单没有 转换为版本化模型 项目 跳过这一步会使 Xco
  • APPX Windows 应用商店包可以包含多个“应用程序”吗?

    我试图更好地理解 APPX 包的 appxmanifest 文件 我注意到它有一个
  • 在“沙盒环境”中从 .Net 应用程序加载程序集

    I am 目前正在开发一个应用程序用户将动态选择 dll 应用程序将执行该 dll 中的一些方法 如果您点击第一个链接 您会看到我正在开发一种Robocode使用 Net Framework的游戏应用程序 例如 当战斗开始时 run执行 d
  • JScrollPane 和 JViewport 最大尺寸小于内容的滚动限制

    我有一个JFrame含有一个JScrollPane含有一个JPanel The JPanel包含一堆JTextAreas 我正在向其中加载大量文本 大约 8k 10k 个字符 布局工作正常 尽管滚动有点滞后 真正的问题似乎是JPanel J
  • Laravel 5 覆盖登录功能

    我正在开发 Laravel 项目并尝试覆盖 AuthenticatesAndRegistersUsers 中的默认 postLogin 所以我更新了我的 AuthController 并添加了它来覆盖内置登录 public function
  • 无需 Firebase 云消息传递即可推送通知

    是否可以使用第 3 方服务来发送推送通知而不依赖 Google 的 Firebase 云消息传递 FCM 如果默认情况下应用程序中不包含 Firebase 包 那么创建 使用自定义框架是否可以具有与 Firebase 类似的功能集 或者 F
  • 将文本添加到字符串的开头

    在字符串开头添加新值最快的方法是什么 var mystr Doe mystr John mystr 这对你不起作用吗
  • 字符到字形映射表

    我正在关注apple com 上的文档 我设法得到The cmap encoding subtables 我100 知道platformID platformSpecificID是正确的 但是offset是可疑的 这是数据 array 3