Jan*_*sen 40
这是一个使用FontTools模块的方法(你可以安装类似的东西pip install fonttools):
#!/usr/bin/env python
from itertools import chain
import sys
from fontTools.ttLib import TTFont
from fontTools.unicode import Unicode
ttf = TTFont(sys.argv[1], 0, verbose=0, allowVID=0,
ignoreDecompileErrors=True,
fontNumber=-1)
chars = chain.from_iterable([y + (Unicode[y[0]],) for y in x.cmap.items()] for x in ttf["cmap"].tables)
print(list(chars))
# Use this for just checking if the font contains the codepoint given as
# second argument:
#char = int(sys.argv[2], 0)
#print(Unicode[char])
#print(char in (x[0] for x in chars))
ttf.close()
Run Code Online (Sandbox Code Playgroud)
该脚本将字体路径作为参数:
python checkfont.py /path/to/font.ttf
Run Code Online (Sandbox Code Playgroud)
小智 27
Linux程序xfd可以做到这一点.它在我的发行版中提供为'xorg-xfd'.要查看字体的所有字符,可以在终端中运行:
xfd -fa "DejaVu Sans Mono"
Run Code Online (Sandbox Code Playgroud)
nim*_*nim 12
fc-query my-font.ttf将根据fontconfig为您提供支持的字形和字体适合的所有语言环境的映射
由于几乎所有现代Linux应用程序都基于fontconfig,因此这比原始unicode列表更有用
这里讨论实际的输出格式 http://lists.freedesktop.org/archives/fontconfig/2013-September/004915.html
这是一个POSIX [1] shell 脚本,它可以fc-match在Neil Mayhew 的回答中提到的帮助下以一种很好且简单的方式打印代码点和字符(它甚至可以处理多达 8 位十六进制数字的 Unicode):
#!/bin/bash
for range in $(fc-match --format='%{charset}\n' "$1"); do
for n in $(seq "0x${range%-*}" "0x${range#*-}"); do
n_hex=$(printf "%04x" "$n")
# using \U for 5-hex-digits
printf "%-5s\U$n_hex\t" "$n_hex"
count=$((count + 1))
if [ $((count % 10)) = 0 ]; then
printf "\n"
fi
done
done
printf "\n"
Run Code Online (Sandbox Code Playgroud)
您可以传递字体名称或任何fc-match接受的内容:
$ ls-chars "DejaVu Sans"
Run Code Online (Sandbox Code Playgroud)
更新内容:
我了解到 subshell 非常耗时(printf我脚本中的subshell)。所以我设法编写了一个速度提高了 5-10 倍的改进版本!
$ ls-chars "DejaVu Sans"
Run Code Online (Sandbox Code Playgroud)
旧版本:
$ time ls-chars "DejaVu Sans" | wc
592 11269 52740
real 0m2.876s
user 0m2.203s
sys 0m0.888s
Run Code Online (Sandbox Code Playgroud)
新版本(行号表示 5910+ 个字符,0.4 秒!):
$ time ls-chars "DejaVu Sans" | wc
592 11269 52740
real 0m0.399s
user 0m0.446s
sys 0m0.120s
Run Code Online (Sandbox Code Playgroud)
更新结束
示例输出(它在我的 st 终端中更好地对齐):
0020 0021 ! 0022 " 0023 # 0024 $ 0025 % 0026 & 0027 ' 0028 ( 0029 )
002a * 002b + 002c , 002d - 002e . 002f / 0030 0 0031 1 0032 2 0033 3
0034 4 0035 5 0036 6 0037 7 0038 8 0039 9 003a : 003b ; 003c < 003d =
003e > 003f ? 0040 @ 0041 A 0042 B 0043 C 0044 D 0045 E 0046 F 0047 G
...
1f61a 1f61b 1f61c 1f61d 1f61e 1f61f 1f620 1f621 1f622 1f623
1f625 1f626 1f627 1f628 1f629 1f62a 1f62b 1f62d 1f62e 1f62f
1f630 1f631 1f632 1f633 1f634 1f635 1f636 1f637 1f638 1f639
1f63a 1f63b 1f63c 1f63d 1f63e 1f63f 1f640 1f643
Run Code Online (Sandbox Code Playgroud)
[1]似乎\U在printf不POSIX标准?
这些fontconfig命令可以将字形列表输出为范围的紧凑列表,例如:
$ fc-match --format='%{charset}\n' 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
Run Code Online (Sandbox Code Playgroud)
使用fc-query的.ttf文件和fc-match已安装的字体名称。
这可能不涉及安装任何额外的程序包,也不涉及翻译位图。
使用fc-match --format='%{file}\n'检查正确的字体是否被匹配。
我刚刚遇到了同样的问题,并制作了一个更进一步的HOWTO ,烘焙所有受支持的 Unicode 代码点的正则表达式。
ttx如果您只想要代码点数组,则可以在运行后在 Chrome 开发工具中查看 xml 时使用它ttx -t cmap myfont.ttf,并且可能重命名myfont.ttx为myfont.xml以调用 Chrome 的 xml 模式:
function codepoint(node) { return Number(node.nodeValue); }
$x('//cmap/*[@platformID="0"]/*/@code').map(codepoint);
Run Code Online (Sandbox Code Playgroud)
(也依赖于fonttoolsgilamesh 的建议;sudo apt-get install fonttools如果你使用的是 ubuntu 系统。)
| 归档时间: |
|
| 查看次数: |
21132 次 |
| 最近记录: |