OpenType的cmap中platformID和encodingID是啥意思?

Posted

技术标签:

【中文标题】OpenType的cmap中platformID和encodingID是啥意思?【英文标题】:what's the meaning of platformID and encodingID in the cmap of OpenType?OpenType的cmap中platformID和encodingID是什么意思? 【发布时间】:2014-10-06 13:30:41 【问题描述】:

规范(http://www.microsoft.com/typography/otspec/cmap.htm)只有platformID 3(windows)和platformID 1(Mac)以及windows平台的encodingID。 windows之外的其他平台和其他编码呢?

我使用 ttfdump 转储其中一种 adobe 字体,它给了我:

'cmap' Table - Character to Glyph Index Mapping Table
-----------------------------------------------------
         'cmap' version: 0
         number of encodings: 5
         number of subtables: 3

Encoding   0.    PlatformID:  0
                 EcodingID:   3
                 SubTable: 0, Offset: 0x00000a0e

Encoding   1.    PlatformID:  0
                 EcodingID:   4
                 SubTable: 1, Offset: 0x0000cc26

Encoding   2.    PlatformID:  1
                 EcodingID:  25
                 SubTable: 2, Offset: 0x0000002c

Encoding   3.    PlatformID:  3
                 EcodingID:   1
                 SubTable: 0, Offset: 0x00000a0e

Encoding   4.    PlatformID:  3
                 EcodingID:  10
                 SubTable: 1, Offset: 0x0000cc26

所以它确实有其他平台和编码,但在哪里可以找到定义?

【问题讨论】:

他们的实际文档在microsoft.com/typography/otspec/name.htm 是的。实际上 MS 文档中的链接已损坏,并且 ISO 文档中的章节编号错误。所以我一开始就错过了那张桌子。 【参考方案1】:

您错过了说明更多信息在名称表文档中的文字,在 http://www.microsoft.com/typography/otspec/name.htm,其中包含每个平台支持的编码和语言的(长)列表。

【讨论】:

【参考方案2】:

Microsoft documentation中有如下表格:

 Platform ID  | Platform name | Platform-specific encoding IDs  | Language IDs
 -------------|---------------|---------------------------------|--------------
 0            | Unicode       | Various                         | Various 
 1            | Macintosh     | Script manager code             | Various
 2            | ISO [deprec]  | ISO encoding [deprecated]       | None 
 3            | Windows       | Windows encoding                | Various 
 4            | Custom        | Custom                          | None

关于非标准编码 ID:

如果一个新的 Unicode 平台的编码 ID Unicode 版本移动字符,以便正确指定 字符代码语义。(由于 Unicode 稳定性策略,例如 没有预料到需要。) Unicode 之间的区别 特定于平台的编码 ID 1 和 2 仅出于历史原因; Unicode 标准实际上在曲目和编码方面是相同的 符合 ISO 10646。对于当前字体的所有实际用途, 编码 ID 0、1 和 2 提供的区别并不重要, 因此这些编码 ID 已被弃用。

一个新的编码 ID 当新的 cmap 子表时,有时也会分配 Unicode 平台 格式被添加到规范中,以便允许 与现有解析器的兼容性。例如,当 cmap 子表 格式 10 和 12 被添加到规范中,编码 ID 4 是 也添加了,当 cmap 子表格式 13 添加到 规范,添加了编码 ID 6。 cmap 子表格式 上表中列出的是唯一可用于 对应的编码ID。

【讨论】:

以上是关于OpenType的cmap中platformID和encodingID是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将CFF字体转换为OpenType字体

Microsoft Windows OpenType Font (OTF)驱动程序无效数组远程代码执行漏洞(MS10-091)

字符到字形映射表

OTS 解析错误:无法从字体数据中实例化字体

带有 itext 的 OpenType 字体字距调整

“从用户数据存储中检索信息时出错,未找到平台。”出错时的解决办法