কোডপয়েন্টে রেন্ডারিংয়ের জন্য সেরা ফন্টটি সন্ধান করুন


16

ইউনিকোড কোডপয়েন্টগুলি উপস্থাপনের জন্য উপযুক্ত ফন্টটি কীভাবে সন্ধান করবেন?

gnome-terminalসন্ধান করুন যে my 🉃 ⼼ 😻🕲🝤 like এর মতো অক্ষরগুলি আমার টার্মিনাল ফন্ট বা কোডপয়েন্ট-ইন-স্কোয়ার ফ্যালব্যাক (????) এর চেয়ে সিম্বুলার মতো ফন্টের সাথে রেন্ডার করা যেতে পারে। কীভাবে?


উত্তর:


14

এটি অগত্যা সর্বোত্তম পদ্ধতি নয় এবং এটি নিশ্চিত যে ব্যবহারকারী-বান্ধব নয়, তবে এটি কাজ করা সহজ: এটি করার জন্য পাইথনের স্ক্রিপ্ট এখানে।

পাইথন-ফন্টকনফিগ লাইব্রেরি ইনস্টল করুন । হয় এটি আপনার বিতরণ থেকে (উদাহরণস্বরূপ sudo apt-get install python-fontconfigডেবিয়ান এবং ডেরিভেটিভসগুলিতে) পান বা আপনার হোম ডিরেক্টরিতে এটি ইনস্টল করুন ( 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 🉃⼼😻🕲🝤
$ echo $?
1

এই সমস্ত চরিত্রের সাথে আমার কোনও ফন্ট নেই।

$ fc-search-codepoint U+1F64D
/usr/share/fonts/truetype/unifont/unifont_upper.ttf
/usr/share/fonts/truetype/unifont/unifont_upper_csur.ttf

1
এটি একটি খুব সহায়ক স্ক্রিপ্ট! যাইহোক, এটি কেবল পাইথন 2 অনুবর্তী, এবং আমি মনে করি ঠিক যে বহনযোগ্য এটি করা কিছুটা খারাপ লাগবে। আপনি পরিবর্তন অন্তত কিছু মনে করবে #!/usr/bin/env pythonকরার #!/usr/bin/env python2যেমন প্রতি PEP 394.
Zulan

1
এই উত্তরের জন্য ধন্যবাদ! এটা খুব সহায়ক ছিল। আমি নিশ্চিত যে ফন্ট ফ্যালব্যাক বাস্তবায়নকারী ওএস বা সিস্টেম লাইব্রেরিগুলি আরও কার্যকর কিছু করছে, কিন্তু এটি কাজ করে। @ জুলান এটির সাথেও কাজ করা যেতে পারে python3; আমি এই উত্তরের নীচে এটির একটি ছোট সংস্করণ লিখেছি ।
শ্রীভাতসারআর

5

ফন্টকনফিগ ব্যবহার করে,

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

যেমন

> fc-list ':charset=2713 2717'

font এবং ✗ থাকা কোনও ফন্ট ফাইলের নাম প্রদর্শন করবে ✗

অক্ষর ব্যবহারের সাথে সম্পর্কিত কোডপয়েন্ট পেতে (উদাহরণস্বরূপ)

> printf "%x" \'✓
2713>

এই ব্যবহার কিছুটা অস্পষ্ট বৈশিষ্ট্য এর POSIX printfউপযোগ :

শীর্ষস্থানীয় অক্ষরটি যদি একক-উদ্ধৃতি বা ডাবল-উদ্ধৃতি হয় তবে মানটি একক-উদ্ধৃতি বা ডাবল-উদ্ধৃতি অনুসরণ করে অক্ষরের অন্তর্নিহিত কোডসেটের সংখ্যাসূচক মান হবে।

একসাথে নেওয়া,

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

এর থেকে নামগুলি xargs -Iপ্রতিস্থাপন করতে এটি পতাকা ব্যবহার করে । সুতরাং এটি কার্যকরভাবে এড়াতে:{}stdin

> fc-list ":charset=2713"

2
মনে রাখবেন আপনি একটি সংস্করণ প্রয়োজন fontconfigযে 2.11.91বা পরে
নাথানিয়েল এম। বিভার

1
উল্লেখ্য যে ড্যাশ printfএবং /bin/printfসমর্থন করে না
স্টিভেন পেনি

1
অসাধারণ! আমি দীর্ঘদিন ধরে এ সম্পর্কিত তথ্য খুঁজছি। নোট করুন যে আপনি একক অক্ষরগুলির পাশাপাশি ব্যাপ্তিগুলিও নির্দিষ্ট করতে পারেন, তাই সমস্ত ফন্টের সন্ধান করতে যাতে বাক্স-অঙ্কনের সমস্ত অক্ষর রয়েছে, উদাহরণস্বরূপ:fc-list --format='%{postscriptname}\n' ':charset=2500-257F'
নিল মেহেজ

3

শেষ পর্যন্ত জিনোম-টার্মিনাল ফন্টকনফিগ ব্যবহার করে (অন্যান্য জিনিসের মধ্যে):

... আপনি ইনস্টল করা ফন্টগুলির সেটগুলির মধ্যে দক্ষতার সাথে এবং দ্রুত আপনার প্রয়োজনীয় ফন্টগুলি সন্ধান করুন, এমনকি আপনি হাজার হাজার ফন্ট ইনস্টল করেছেন ...

ইন এপিআই ডকুমেন্টেশন আপনি ক্যোয়ারী ফন্ট চরিত্র রেঞ্জ প্রয়োজন এবং চরিত্র রেঞ্জ উপর অপারেশনের জন্য ফাংশন খুঁজে পেতে পারেন, কিন্তু ডকুমেন্টেশন তাই রহস্যপূর্ণ যা আমি কখনও চিন্তা করা কিভাবে ফাংশন বিভিন্ন সেট একে অপরের সাথে সম্পর্কযুক্ত পারে। যদি আমার আরও গভীর ডুব দেওয়ার দরকার হয় তবে আমি বরং অন্যান্য সফ্টওয়্যারগুলির ব্যবহারের উদাহরণগুলি দেখতে পারি, সম্ভবত ভিটিই (জিনোম-টার্মিনালে ব্যবহৃত টার্মিনাল এমুলেশন লাইব্রেরি)।

ভিটিএ এবং ফন্টকনফিগের মধ্যে থাকা অন্য একটি গ্রন্থাগার হ'ল পঙ্গো "... আন্তর্জাতিকীকরণের উপর জোর দিয়ে পাঠ্য রচনা এবং উপস্থাপনের জন্য একটি গ্রন্থাগার ..." । এখন যেহেতু আমি এটির কথা ভাবি, এটি আপনার পরে যুক্তিযুক্ত বেশিরভাগ যুক্তিকে ধারণ করে বলে মনে হচ্ছে।

প্যাঙ্গোতে অক্ষর কভারেজ কার্যকারিতা কভারেজ মানচিত্রের দ্বারা প্রয়োগ করা হয় ( "প্রায়শই প্যাঙ্গোতে এটি নির্দিষ্ট করা প্রয়োজন যে কোনও নির্দিষ্ট ফন্ট নির্দিষ্ট চরিত্রের প্রতিনিধিত্ব করতে পারে কিনা এবং এটি সেই চরিত্রটিকে কতটা ভালভাবে উপস্থাপন করতে পারে তাও নির্ধারণ করা উচিত। প্যাঙ্গো কভারেজ একটি ডেটা কাঠামো যা ব্যবহৃত হয় সেই তথ্য উপস্থাপন করার জন্য। " ), তবে সম্ভবত আরও জটিল বিশদ জড়িত রয়েছে যে কোন গালিফটি কোন ফন্টের সাথে রেন্ডার করতে হবে তা স্থির করে। আমি VTE উপর নির্ভর Pango উপযুক্ত ফন্ট সঙ্গে স্ট্রিং রেন্ডার করতে যখন Pango ব্যবহারসমূহ fontconfig এর (বা অন্যান্য সমর্থিত ফন্ট ব্যাকএন্ড) এ যুক্তির উদঘাটিত বিভিন্ন উপর ভিত্তি করে সবচেয়ে উপযুক্ত ফন্ট এটি Pango নিজেই এবং / অথবা ব্যাকএন্ড।


1

কোনও ফন্টে একটি নির্দিষ্ট স্ট্রিংয়ের সমস্ত অক্ষর রয়েছে কিনা তা পরীক্ষা করার জন্য আমি কোডটি পরিবর্তন করেছি। সুতরাং fc-search-codepoint "$fontname" "$string"এটি দ্বারা কল করা যেতে পারে এবং এটি প্রস্থান কোড 0 সাফল্যে বা অন্যথায় 1 প্রদান করে। ফন্টের নামগুলি fc-query /path/to/FontSandMonoBoldOblique.ttfইমেজম্যাগিক থেকে পুনরুদ্ধার করা যেতে পারে 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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.