找出给定字体支持的字符

2024-11-06 08:34:00
admin
原创
293
摘要:问题描述:如何从 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 终端中对齐更好

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用