web-dev-qa-db-ja.com

特定のフォントがサポートする文字を見つける

LinuxのTrueTypeまたは埋め込みOpenTypeフォントからサポートされているUnicode文字のリストを抽出するにはどうすればよいですか?

.ttfまたは.eotファイルを処理し、フォントによって提供されるコードポイント(U + 0123、U + 1234など)のリストを作成するために使用できるツールまたはライブラリはありますか?

60
Till Ulen

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
38
Janus Troelsen

Linuxプログラムxfdはこれを行うことができます。私のディストリビューションでは「xorg-xfd」として提供されています。フォントのすべての文字を表示するには、ターミナルでこれを実行できます:

xfd -fa "DejaVu Sans Mono"
27
Spencer

fc-query my-font.ttfは、サポートされているグリフと、フォントが適切なすべてのロケールのマップをfontconfigに従って提供します

ほとんどすべての最新のLinuxアプリはfontconfigベースであるため、これは生のunicodeリストよりもはるかに便利です。

実際の出力形式については、ここで説明します http://lists.freedesktop.org/archives/fontconfig/2013-September/004915.html

12
nim

Ttf/otfフォントの文字コードポイントは、CMAPテーブルに格納されます。

ttxを使用して、CMAPテーブルのXML表現を生成できます。 こちら を参照してください。

コマンドttx.exe -t cmap MyFont.ttfを実行すると、ファイルMyFont.ttxが出力されます。それをテキストエディタで開くと、フォントで見つかったすべての文字コードが表示されます。

8
wschang

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'は、正しいフォントが一致しているかどうかを確認します。

5
Neil Mayhew

同じ問題が発生し、 [〜#〜] 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を使用してください。)

4
ecmanaut

フォントを「表示」するだけの場合は、次の方法が役立つ場合があります(問題のフォントが端末でサポートされている場合)。

#!/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 )に感謝します。

0

フォントでサポートされているすべての文字を取得したい場合は、次を使用できます(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
0
brunoob

上記の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ミリ秒かかります。

0
zhk_tiger