코드포인트 렌더링에 가장 적합한 글꼴 찾기

코드포인트 렌더링에 가장 적합한 글꼴 찾기

유니코드 코드포인트를 렌더링하는 데 적합한 글꼴을 찾는 방법은 무엇입니까?

gnome-terminal«와 같은 문자를 찾으세요.

답변1

글꼴 구성을 사용하여,

> fc-list ':charset=<hex_code1> <hex_code2>'

예를 들어

> fc-list ':charset=2713 2717'

✓ 및 ✗가 포함된 모든 글꼴 파일 이름이 표시됩니다.

문자 사용에 해당하는 코드포인트를 얻으려면(예를 들어)

> printf "%x" \'✓
2713>

이것은다소 모호한 기능 ~의POSIX printf유틸리티:

선행 문자가 작은 따옴표 또는 큰 따옴표인 경우 값은 작은 따옴표 또는 큰 따옴표 뒤에 오는 문자의 기본 코드 세트에 있는 숫자 값입니다.

함께 찍은,

> printf '%x' \'✓ | xargs -I{} fc-list ":charset={}"

이는 플래그를 사용하여 의 이름으로 xargs -I대체합니다 . 따라서 이는 다음과 같이 요약됩니다.{}stdin

> fc-list ":charset=2713"

답변2

이것이 반드시 최선의 방법은 아니며 확실히 사용자 친화적이지는 않지만 작업하기 쉽습니다. 여기에 Python 스크립트가 있습니다.

설치하다Python 글꼴 구성도서관. 배포판(예 sudo apt-get install python-fontconfig: Debian 및 파생 제품)에서 가져오거나 홈 디렉터리( )에 설치합니다 . 그런 다음 이 스크립트를 실행할 수 있습니다( 예: 일반적 으로 의 디렉터리에 pip install --user python-fontconfig)저장하고 실행 가능하게 만듭니다).fc-search-codepointPATH~/bin

#!/usr/bin/env python2
import re, sys
import fontconfig
if len(sys.argv) < 1:
    print('''Usage: ''' + sys.argv[0] + '''CHARS [REGEX]
Print the names of available fonts containing the code point(s) CHARS.
If CHARS contains multiple characters, they must all be present.
Alternatively you can use U+xxxx to search for a single character with
code point xxxx (hexadecimal digits).
If REGEX is specified, the font name must match this regular expression.''')
    sys.exit(0)
characters = sys.argv[1]
if characters.startswith('U+'):
    characters = unichr(int(characters[2:], 16))
else:
    characters = characters.decode(sys.stdout.encoding)
regexp = re.compile(sys.argv[2] if len(sys.argv) > 2 else '')

font_names = fontconfig.query()
found = False
for name in font_names:
    if not re.search(regexp, name): continue
    font = fontconfig.FcFont(name)
    if all(font.has_char(c) for c in characters):
        print(name)
        found = True

sys.exit(0 if found else 1)

사용 예:

$ fc-search-codepoint 

답변3

궁극적으로 그놈 터미널 사용글꼴 구성(무엇보다도):

...수천 개의 글꼴을 설치했더라도 설치한 글꼴 세트 중에서 필요한 글꼴을 효율적이고 빠르게 찾을 수 있습니다...

에서API 문서글꼴 문자 범위를 쿼리하고 문자 범위에 대한 작업을 수행하는 함수를 찾을 수 있지만 문서가 너무 비밀스러워서 서로 다른 함수 집합이 서로 어떻게 관련되어 있는지 알 수 없습니다. 더 자세히 알고 싶다면 다른 소프트웨어의 사용 사례를 살펴보는 편이 낫습니다.vte(gnome-terminal에서 사용되는 터미널 에뮬레이션 라이브러리)

그 사이에 또 ​​다른 도서관vte그리고글꼴 구성~이다팡고 "...국제화에 중점을 두고 텍스트 레이아웃 및 렌더링을 위한 라이브러리...". 지금 생각해보면 당신이 추구하는 논리의 대부분을 담고 있는 것 같네요.

pango의 문자 범위 기능은 다음과 같이 구현됩니다.적용 범위 지도("Pango에서는 특정 글꼴이 특정 문자를 나타낼 수 있는지, 그리고 해당 문자를 얼마나 잘 나타낼 수 있는지 확인하는 것이 종종 필요합니다. PangoCoverage는 해당 정보를 나타내는 데 사용되는 데이터 구조입니다."), 그러나 어떤 글꼴로 어떤 글리프를 렌더링할지 결정하는 데 관련된 더 복잡한 세부 사항이 있을 수 있습니다. 내 생각엔VTE에 의존팡고적절한 글꼴로 문자열을 렌더링하는 동안팡고용도글꼴 구성(또는 기타 지원되는 글꼴 백엔드)에서 다양한 로직을 기반으로 가장 적합한 글꼴을 찾습니다.팡고자체 및/또는 백엔드.

답변4

글꼴에 특정 문자열의 모든 문자가 포함되어 있는지 확인하기 위해 코드를 변경했습니다. 따라서 이것은 호출될 수 fc-search-codepoint "$fontname" "$string"있으며 성공 시 종료 코드 0을 반환하고 그렇지 않으면 1을 반환합니다. 글꼴 이름은 fc-query /path/to/FontSandMonoBoldOblique.ttf또는 Imagemagick의 에서 검색할 수 있습니다 convert -list font. 이를 사용하여 사용자가 선택한 문자열을 사용자가 선택한 글꼴로 렌더링할 수 있는지 확인하고 명령이 실패하면 대체 글꼴이 사용됩니다.

#!/usr/bin/env python2
import re
import sys
import os
import fontconfig
if len(sys.argv) < 3:
    print("Usage: " + sys.argv[0] + " 'Fontname-Bold' 'String to check'")
    sys.exit(0)

font_name = sys.argv[1].decode('utf-8')
string = sys.argv[2].decode('utf-8')

if '-' in font_name:
        font_name = font_name.split('-')
        font_style = font_name[-1]
        font_name = ''.join(font_name[:-1])
else:
        font_style = ""

font_names = fontconfig.query()
for name in font_names:
    font = fontconfig.FcFont(name)
    if not len(font.family) > 0:
        continue
    for item in font.family:
        if item[1] == unicode(font_name):
            if len(font_style) == 0:
                match = "yes"
            else:
                for item in font.style:
                    if item[1] == unicode(font_style):
                        match = "yes"
            try:
                match
            except NameError:
                continue
            if all(font.has_char(c) for c in string):
                sys.exit(0)
            else:
                sys.exit(1)
print >> sys.stderr, "font not found: " + font_name + " " + font_style
sys.exit(1)

관련 정보