找出给定字体支持的字符

2024-11-06 08:34:00
admin
原创
43
摘要:问题描述:如何从 Linux 上的 TrueType 或嵌入式 OpenType 字体中提取支持的 Unicode 字符列表?是否有一个工具或库可以用来处理 .ttf 或 .eot 文件并构建字体提供的代码点列表(如 U+0123、U+1234 等)?解决方案 1:以下是使用fontTools Python ...

问题描述:

如何从 Linux 上的 TrueType 或嵌入式 OpenType 字体中提取支持的 Unicode 字符列表?

是否有一个工具或库可以用来处理 .ttf 或 .eot 文件并构建字体提供的代码点列表(如 U+0123、U+1234 等)?


解决方案 1:

以下是使用fontTools Python 库的方法(您可以使用类似的方法安装pip install fonttools):

#!/usr/bin/env python
from itertools import chain
import sys

from fontTools.ttLib import TTFont
from fontTools.unicode import Unicode

with TTFont(
    sys.argv[1], 0, allowVID=0, ignoreDecompileErrors=True, fontNumber=-1
) as ttf:
    chars = chain.from_iterable(
        [y + (Unicode[y[0]],) for y in x.cmap.items()] for x in ttf["cmap"].tables
    )
    if len(sys.argv) == 2:  # print all code points
        for c in chars:
            print(c)
    elif len(sys.argv) >= 3:  # search code points / characters
        code_points = {c[0] for c in chars}
        for i in sys.argv[2:]:
            code_point = int(i)   # search code point
            #code_point = ord(i)  # search character
            print(Unicode[code_point])
            print(code_point in code_points)

该脚本将字体路径和可选的代码点/字符作为要搜索的参数:

$ python checkfont.py /usr/share/fonts/**/DejaVuSans.ttf
(32, 'space', 'SPACE')
(33, 'exclam', 'EXCLAMATION MARK')
(34, 'quotedbl', 'QUOTATION MARK')
…

$ python checkfont.py /usr/share/fonts/**/DejaVuSans.ttf 65 12622  # a ㅎ
LATIN CAPITAL LETTER A
True
HANGUL LETTER HIEUH
False

解决方案 2:

X 程序xfd可以做到这一点。要查看“DejaVu Sans Mono”字体的所有字符,请运行:

xfd -fa "DejaVu Sans Mono"

它包含在 Debian/Ubuntu 上的 x11-utils 包、Fedora/RHEL 上的 xorg-x11-apps 包以及 Arch Linux 上的 xorg-xfd 包中。

解决方案 3:

fontconfig命令可以将字形列表输出为紧凑的范围列表,例如:

$ fc-match --format='%{charset}
' OpenSans
20-7e a0-17f 192 1a0-1a1 1af-1b0 1f0 1fa-1ff 218-21b 237 2bc 2c6-2c7 2c9
2d8-2dd 2f3 300-301 303 309 30f 323 384-38a 38c 38e-3a1 3a3-3ce 3d1-3d2 3d6
400-486 488-513 1e00-1e01 1e3e-1e3f 1e80-1e85 1ea0-1ef9 1f4d 2000-200b
2013-2015 2017-201e 2020-2022 2026 2030 2032-2033 2039-203a 203c 2044 2070
2074-2079 207f 20a3-20a4 20a7 20ab-20ac 2105 2113 2116 2120 2122 2126 212e
215b-215e 2202 2206 220f 2211-2212 221a 221e 222b 2248 2260 2264-2265 25ca
fb00-fb04 feff fffc-fffd

用于fc-query文件.ttffc-match已安装的字体名称。

这可能不涉及安装任何额外的软件包,也不涉及翻译位图。

用于`fc-match --format='%{file}
'`检查是否匹配正确的字体。

解决方案 4:

fc-query my-font.ttf将为您提供受支持的字形图以及根据 fontconfig字体适用的所有语言环境

由于几乎所有现代 Linux 应用程序都是基于字体配置的,因此这比原始的 unicode 列表更有用

实际的输出格式在这里讨论
http://lists.freedesktop.org/archives/fontconfig/2013-September/004915.html

解决方案 5:

下面是一个POSIX [1] shell 脚本,它可以以一种简单易行的方式打印代码点和字符,Neil Mayhew 的回答fc-match中提到了它的帮助(它甚至可以处理最多 8 位十六进制数字的 Unicode):

#!/bin/bash
for range in $(fc-match --format='%{charset}
' "$1"); do
    for n in $(seq "0x${range%-*}" "0x${range#*-}"); do
        n_hex=$(printf "%04x" "$n")
        # using U for 5-hex-digits
        printf "%-5sU$n_hex    " "$n_hex"
        count=$((count + 1))
        if [ $((count % 10)) = 0 ]; then
            printf "
"
        fi
    done
done
printf "
"

您可以传递字体名称或任何fc-match可以接受的内容:

$ ls-chars "DejaVu Sans"

更新内容:

我了解到 subshel​​l 非常耗时(printf我脚本中的 subshel​​l)。所以我设法编写了一个改进版本,速度提高了 5-10 倍!

#!/bin/bash
for range in $(fc-match --format='%{charset}
' "$1"); do
    for n in $(seq "0x${range%-*}" "0x${range#*-}"); do
        printf "%04x
" "$n"
    done
done | while read -r n_hex; do
    count=$((count + 1))
    printf "%-5sU$n_hex    " "$n_hex"
    [ $((count % 10)) = 0 ] && printf "
"
done
printf "
"

旧版:

$ time ls-chars "DejaVu Sans" | wc
    592   11269   52740

real    0m2.876s
user    0m2.203s
sys     0m0.888s

新版本(行号表示 5910+ 个字符,耗时 0.4 秒!):

$ time ls-chars "DejaVu Sans" | wc
    592   11269   52740

real    0m0.399s
user    0m0.446s
sys     0m0.120s

更新结束

示例输出(它在我的 st 终端中对齐更好

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用