PHP - 确定给定字体中是否存在字形
PHP - Determine if a glyph exists in a given font
我想看看在 PHP 中是否有一种方法可以确定字体中给定字符的字形是否存在。
我的用例是这样的——我正在使用 Imagick 生成小图像——本质上是小图像 "badges" 给定用户提供的信息,我真的很想支持完整的 Unicode,包括表情符号和诸如此类的东西。截至目前,我有一些字体,每种字体都很好地支持 "class" 个字符(例如,我的 "main" 字体是 Futura,我有用于表情符号和其他符号的 Symbola,我可能需要为东方字形添加另一种字体),但它们没有足够的重叠来仅使用一种字体。
我看到 post 表明商业 PDFlib 附加组件可以做到这一点,但我想尽可能避免使用商业附加组件。我还看到 PECL PS 附加组件具有 ps_symbol_name(),但这需要 AFM 文件,据我所知,我不能将其用于多字节字体。
我已经在 Imagick 中处理了字体切换部分 - 我只需要知道如何以编程方式告诉它给定字符使用什么字体。谢谢!
根据您需要执行的操作的复杂性,请查看我出于相同目的而编写的 https://github.com/pomax/php-font-parser(尽管使用 gd
而不是 imagemagick)。
请注意,仅支持 CMAP 4 和 12,涵盖 UCS-2 和 UCS-4。更高的代码点即使存在于字体中也可能找不到(主要是因为当我写这篇文章时,Unicode 还没有被表情符号污染)。
或者,您可以使用类似 AdobeFDK 的 tx
program, running it against your font through shell-exec or the like, to see if it finds a glyph definition, or you can run the entire font through ttx,将 CMAP table 的 XML 保存为自己的文件,然后 运行 您的支票反对那个(如果你的字体不太可能改变很多,这是一个非常可靠的解决方案)
这是使用 PHP.
检查给定字体 (OTF / TTF) 是否支持 UTF-8 字符的另一种解决方案
- 从您的字体中提取所有受支持代码点的列表
- 将您的字符/字符串转换为相应代码点的列表
- 将您的字符串的代码点与支持的列表进行比较
您的字体代码点以确定它们是否受支持
我建议使用像 pdf-font-lib 这样的现有库来从您的字体中提取支持的代码点列表。
要将 UTF-8 字符串转换为代码点,您可以使用 this code snippet。
这里有一个 complete example 用于检查给定字符串的所有字母是否受 OTF 字体支持。 (需要 php-font-lib,不包括字体)
这种方法也可以用作检测用于呈现给定 UTF-8 字符串的最佳字体的简单方法的基础:
- 浏览所有现有字体
- 比较每种字体支持的字符对字符串的覆盖率
- 选择覆盖率最高的字体或默认字体作为后备
我想看看在 PHP 中是否有一种方法可以确定字体中给定字符的字形是否存在。
我的用例是这样的——我正在使用 Imagick 生成小图像——本质上是小图像 "badges" 给定用户提供的信息,我真的很想支持完整的 Unicode,包括表情符号和诸如此类的东西。截至目前,我有一些字体,每种字体都很好地支持 "class" 个字符(例如,我的 "main" 字体是 Futura,我有用于表情符号和其他符号的 Symbola,我可能需要为东方字形添加另一种字体),但它们没有足够的重叠来仅使用一种字体。
我看到 post 表明商业 PDFlib 附加组件可以做到这一点,但我想尽可能避免使用商业附加组件。我还看到 PECL PS 附加组件具有 ps_symbol_name(),但这需要 AFM 文件,据我所知,我不能将其用于多字节字体。
我已经在 Imagick 中处理了字体切换部分 - 我只需要知道如何以编程方式告诉它给定字符使用什么字体。谢谢!
根据您需要执行的操作的复杂性,请查看我出于相同目的而编写的 https://github.com/pomax/php-font-parser(尽管使用 gd
而不是 imagemagick)。
请注意,仅支持 CMAP 4 和 12,涵盖 UCS-2 和 UCS-4。更高的代码点即使存在于字体中也可能找不到(主要是因为当我写这篇文章时,Unicode 还没有被表情符号污染)。
或者,您可以使用类似 AdobeFDK 的 tx
program, running it against your font through shell-exec or the like, to see if it finds a glyph definition, or you can run the entire font through ttx,将 CMAP table 的 XML 保存为自己的文件,然后 运行 您的支票反对那个(如果你的字体不太可能改变很多,这是一个非常可靠的解决方案)
这是使用 PHP.
检查给定字体 (OTF / TTF) 是否支持 UTF-8 字符的另一种解决方案- 从您的字体中提取所有受支持代码点的列表
- 将您的字符/字符串转换为相应代码点的列表
- 将您的字符串的代码点与支持的列表进行比较 您的字体代码点以确定它们是否受支持
我建议使用像 pdf-font-lib 这样的现有库来从您的字体中提取支持的代码点列表。
要将 UTF-8 字符串转换为代码点,您可以使用 this code snippet。
这里有一个 complete example 用于检查给定字符串的所有字母是否受 OTF 字体支持。 (需要 php-font-lib,不包括字体)
这种方法也可以用作检测用于呈现给定 UTF-8 字符串的最佳字体的简单方法的基础:
- 浏览所有现有字体
- 比较每种字体支持的字符对字符串的覆盖率
- 选择覆盖率最高的字体或默认字体作为后备