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

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

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

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-fontconfigDebian 및 그 파생물)에서 가져오거나 홈 디렉터리( )에 설치합니다 . 그런 다음 이 스크립트를 실행할 수 있습니다( 예: 일반 디렉터리에 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 문서글꼴 문자 범위를 쿼리하고 문자 범위에서 작업하는 함수를 찾을 수 있지만 문서가 너무 비밀스러워서 서로 다른 함수 집합이 어떻게 관련되어 있는지 전혀 알 수 없습니다. 더 깊이 파고들려면 다른 소프트웨어의 사용 예를 살펴보는 편이 낫습니다.정맥 혈전색전증(gnome-terminal에서 사용되는 터미널 에뮬레이션 라이브러리).

중간에 또 다른 도서관정맥 혈전색전증그리고글꼴 구성팡고 "...국제화에 중점을 두고 텍스트를 배치하고 렌더링하기 위한 라이브러리...". 지금 생각해보면 당신이 추구하는 논리의 대부분이 여기에 포함되어 있는 것 같습니다.

pango의 문자 커버리지 기능은 다음과 같은 방식으로 구현됩니다.씌우다("Pango에서는 특정 글꼴이 특정 문자를 나타낼 수 있는지 여부와 해당 문자를 어느 정도까지 나타낼 수 있는지 확인해야 하는 경우가 많습니다. PangoCoverage는 해당 정보를 나타내는 데 사용되는 데이터 구조입니다."), 그러나 어떤 글꼴을 어떤 문자 모양으로 렌더링할지 결정하는 데에는 더 복잡한 세부 사항이 있을 수 있습니다. 내 생각엔정맥 혈전색전증의지하다팡고적절한 글꼴로 문자열 렌더링팡고사용글꼴 구성(또는 기타 지원되는 글꼴 백엔드) 다양한 논리를 기반으로 가장 적합한 글꼴을 찾습니다.팡고자체 및/또는 백엔드.

답변4

글꼴에 특정 문자열의 모든 문자가 포함되어 있는지 확인하도록 코드를 변경했습니다. 따라서 이를 호출하여 fc-search-codepoint "$fontname" "$string"성공 시 종료 코드 0을 반환하고 그렇지 않으면 1을 반환할 수 있습니다. 글꼴 이름은 fc-query /path/to/FontSandMonoBoldOblique.ttfImagemagick 또는 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)

관련 정보