找出给定字体支持的字符
- 2024-11-06 08:34:00
- admin 原创
- 43
问题描述:
如何从 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
文件.ttf
和fc-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"
更新内容:
我了解到 subshell 非常耗时(printf
我脚本中的 subshell)。所以我设法编写了一个改进版本,速度提高了 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 终端中对齐更好
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件