유니코드 코드포인트를 렌더링하는 데 적합한 글꼴을 찾는 방법은 무엇입니까?
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-codepoint
PATH
~/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)