LinuxのTrueTypeまたは埋め込みOpenTypeフォントからサポートされているUnicode文字のリストを抽出するにはどうすればよいですか?
.ttfまたは.eotファイルを処理し、フォントによって提供されるコードポイント(U + 0123、U + 1234など)のリストを作成するために使用できるツールまたはライブラリはありますか?
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()
スクリプトは引数としてフォントパスを受け取ります。
python checkfont.py /path/to/font.ttf
Linuxプログラムxfdはこれを行うことができます。私のディストリビューションでは「xorg-xfd」として提供されています。フォントのすべての文字を表示するには、ターミナルでこれを実行できます:
xfd -fa "DejaVu Sans Mono"
fc-query my-font.ttf
は、サポートされているグリフと、フォントが適切なすべてのロケールのマップをfontconfigに従って提供します
ほとんどすべての最新のLinuxアプリはfontconfigベースであるため、これは生のunicodeリストよりもはるかに便利です。
実際の出力形式については、ここで説明します http://lists.freedesktop.org/archives/fontconfig/2013-September/004915.html
Ttf/otfフォントの文字コードポイントは、CMAP
テーブルに格納されます。
ttx
を使用して、CMAP
テーブルのXML表現を生成できます。 こちら を参照してください。
コマンドttx.exe -t cmap MyFont.ttf
を実行すると、ファイルMyFont.ttx
が出力されます。それをテキストエディタで開くと、フォントで見つかったすべての文字コードが表示されます。
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
使用する fc-query
のために .ttf
ファイルとfc-match
インストールされているフォント名。
これには、追加のパッケージのインストールや、ビットマップの変換は含まれていません。
使用する fc-match --format='%{file}\n'
は、正しいフォントが一致しているかどうかを確認します。
同じ問題が発生し、 [〜#〜] howto [〜#〜] を作成すると、サポートされているすべてのUnicodeコードポイントの正規表現が作成されます。
コードポイントの配列だけが必要な場合は、これを使用してttx
xmlをChrome devtoolsで、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);
(gilameshの提案にあるfonttools
にも依存しています。ubuntuシステムを使用している場合はSudo apt-get install fonttools
を使用してください。)
フォントを「表示」するだけの場合は、次の方法が役立つ場合があります(問題のフォントが端末でサポートされている場合)。
#!/usr/bin/env python
import sys
from fontTools.ttLib import TTFont
with TTFont(sys.argv[1], 0, ignoreDecompileErrors=True) as ttf:
for x in ttf["cmap"].tables:
for (_, code) in x.cmap.items():
point = code.replace('uni', '\\u').lower()
print("echo -e '" + point + "'")
安全ではありませんが、簡単に表示する方法:
python font.py my-font.ttf | sh
上記の回答についてJanus( https://stackoverflow.com/a/19438403/431528 )に感謝します。
フォントでサポートされているすべての文字を取得したい場合は、次を使用できます(Janusの回答に基づく)
from fontTools.ttLib import TTFont
def get_font_characters(font_path):
with TTFont(font_path) as font:
characters = {chr(y[0]) for x in font["cmap"].tables for y in x.cmap.items()}
return characters
上記のJanusの答え( https://stackoverflow.com/a/19438403/431528 )は機能します。しかし、pythonは、特にアジアのフォントでは遅すぎます。私のE5コンピュータで40MBのファイルサイズのフォントを使用すると数分かかります。
だから私はそれを行うための小さなC++プログラムを書きます。 FreeType2( https://www.freetype.org/ )に依存します。これはvs2015プロジェクトですが、コンソールアプリケーションであるため、Linuxへの移植は簡単です。
コードはここにあります https://github.com/zhk/AllCodePoints 40MBのファイルサイズのアジア系フォントの場合、E5コンピューターで約30ミリ秒かかります。