تایپوگرافی فارسی
تایپوگرافی فارسی با انتخاب یک قلم زیبا شروع نمی شود، با یک شرط فنی شروع می شود: قلم باید جدول های شکل دهی حروف را داشته باشد، وگرنه حرف ها به هم نمی چسبند و متن ناخوانا می شود. بعد از آن، چهار تصمیم می ماند که هیچ کدام در تایپوگرافی لاتین وجود ندارند: حجم فایل قلم، جای نیم فاصله، شکل عددها، و حرف های عربی که در فارسی غلط اند.
- درس ۵ از ۱۲
- میانی
- رایگان، بدون ثبت نام
برگه ممیزی تایپ فارسی، قبل از تحویل کار
باید باشد
- قلم جدول های init و medi و fina را دارد و حروف واقعا به هم می چسبند
- ارقام فارسی داخل خود قلم هستند و از قلم دیگری قرض گرفته نمی شوند
- دست کم دو وزن واقعی هست، پس مرورگر ضخیم مصنوعی نمی سازد
- فاصله سطر برای فارسی باز شده، بیشتر از عددی که برای لاتین کافی است
- font-display روی optional است تا سوئیچ قلم چیدمان را تکان ندهد
نباید باشد
- حرف عربی به جای حرف فارسی، حتی یک مورد در عنوان ها
- کلمه های چسبیده، یعنی جای نیم فاصله که خالی مانده و پر نشده
- کاراکتر تطویل برای پر کردن عرض یا هم اندازه کردن دو خط
- تراز از دو طرف، که در مرورگر با باز کردن فاصله کلمه ها انجام می شود
- ارقام لاتین و فارسی مخلوط در یک جدول یا یک جمله
این فهرست درباره خط فارسی است و جای ممیزی عمومی تایپوگرافی را نمی گیرد: مقیاس، طول سطر و سلسله مراتب جدا باید چک شوند.
آخرین بررسی: فکت ها و نام ابزارهای این درس در همین تاریخ با منابعشان بازبینی شده اند.
فارسی چه چیزی دارد که لاتین ندارد؟
تفاوت اصلی این است که در فارسی، شکل هر حرف به همسایه هایش بستگی دارد. یک حرف می تواند تا چهار شکل داشته باشد: تنها، اول کلمه، وسط کلمه و آخر کلمه. حرف «ب» در «برف» و «ابر» و «کتاب» سه شکل متفاوت روی صفحه دارد و در حافظه کامپیوتر یک کدپوینت است.
این یک جمله، منشا بیشتر مشکلات فنی تایپوگرافی فارسی است. قلم لاتین یک نگاشت ساده از کدپوینت به گلیف دارد؛ قلم فارسی به یک لایه قاعده احتیاج دارد که تصمیم بگیرد در هر جایگاه کدام گلیف کشیده شود. بخش بعدی درباره همان لایه است.
سه تفاوت دیگر که روی طراحی اثر مستقیم دارند. اول، فارسی حرف بزرگ ندارد؛ پس یکی از رایج ترین اهرم های سلسله مراتب در لاتین اینجا اصلا وجود ندارد و جایش را وزن و اندازه و فاصله می گیرند. دوم، نقطه ها معنادارند و تفاوت چهار حرف فقط نقطه است، پس قلمی که نقطه ها را کوچک یا چسبیده می کشد در اندازه کوچک خطرناک است. سوم، بخش زیادی از حروف زیر خط زمینه می روند و همین باعث می شود متن فارسی در فاصله سطری که برای لاتین کافی است شلوغ به نظر برسد.
و یک تفاوت که کمتر گفته می شود و در چیدمان خودش را نشان می دهد: عرض حروف فارسی خیلی بیشتر از لاتین با هم فرق دارد. در قلمی که همین سایت استفاده می کند، عرض شکل منفرد حروف الفبا از ۲۰۹ تا ۱۲۲۳ واحد از یک em هزار واحدی متغیر است. یعنی دو کلمه فارسی با تعداد حرف برابر می توانند عرض کاملا متفاوتی داشته باشند، و هر تخمینی که بر پایه «تعداد کاراکتر» زده شود در فارسی کم دقت تر از لاتین است.
قلم فارسی وب باید چه چیزی داشته باشد؟
جواب کوتاه: جدول های شکل دهی. در فرمت OpenType اینها را «ویژگی» می نامند و هر کدام یک برچسب چهار حرفی دارد. سه تای حیاتی برای فارسی init و medi و fina هستند: شکل اول، وسط و آخر. کنارشان rlig که ترکیب های اجباری مثل لام الف را می سازد، و ccmp که ترکیب و تجزیه لازم را انجام می دهد.
وقتی این جدول ها نباشند، مرورگر خطا نمی دهد. متن را می نویسد، ولی حرف ها را به هم نمی چسباند و نتیجه چیزی می شود که هر فارسی زبانی در نگاه اول می فهمد غلط است، بی آنکه بتواند بگوید چرا. این دقیقا همان چیزی است که وقتی یک قلم لاتین را روی متن فارسی می گذارید یا وقتی قلم ساب ست شده ای می گیرید که ویژگی هایش حذف شده اند، اتفاق می افتد.
قلمی که همین صفحه با آن نوشته شده، در فایل خودش این ویژگی ها را دارد: ccmp، init، medi، fina، rlig، calt، locl، به اضافه چند ویژگی اختیاری. این را با کتابخانه fontTools از خود فایل خوانده ایم و نه از توضیحات سازنده. اگر قلمی را ارزیابی می کنید، همین کار قابل تکرار است و پنج دقیقه وقت می گیرد.
سه شرط دیگر که قبل از انتخاب باید چک شوند. اول، وزن های واقعی؛ قلمی که فقط یک وزن دارد یعنی مرورگر برای متن ضخیم مجبور می شود ضخیم مصنوعی بسازد و در فارسی نتیجه اش بد است. دوم، عدد فارسی داخل خود قلم، که بخش پنجم همین درس است. سوم، پروانه وب، که برای پروژه مشتری یک موضوع حقوقی است و نه یک جزئیات فنی.
یک حرف فارسی چطور شکل نهایی اش را پیدا می کند
هر پله یک جدول داخل فایل قلم است. اگر یکی نباشد، پله های بعدی هم اجرا نمی شوند.
-
۱
یک کدپوینت ذخیره می شود
حرف در حافظه یک عدد است، مستقل از اینکه اول کلمه باشد یا آخرش.
-
۲
ccmp: ترکیب و تجزیه
حرف و علامت هایش به شکلی در می آیند که قاعده های بعدی بتوانند رویشان کار کنند.
-
۳
init و medi و fina
همسایه ها تعیین می کنند کدام یک از چهار شکل کشیده شود. اگر این جدول نباشد، حروف جدا می مانند.
-
۴
rlig: ترکیب های اجباری
لام و الف با هم یک گلیف می شوند. این ترکیب اختیاری نیست و بدون آن متن غلط دیده می شود.
-
۵
گلیف روی صفحه
آنچه خواننده می بیند. یک کدپوینت اول مسیر، چند شکل ممکن در انتهای آن.
این ترتیب برای فارسی و عربی است. زبان های دیگری با همین خط قاعده های خودشان را دارند و یک قلم می تواند با ویژگی locl آنها را جدا کند.
قلم را سبک کنیم، بدون اینکه بشکند
قلم فارسی از قلم لاتین معادلش بزرگ تر است، چون برای هر حرف چند گلیف دارد و نه یکی. راه استاندارد سبک کردنش ساب ست کردن است: حذف بخش هایی از قلم که این سایت هرگز به آنها نیاز ندارد.
عددهای واقعی همین سایت، خوانده شده از خود فایل ها: نسخه کامل قلم در وزن معمولی ۴۲۷۰۸ بایت است، یعنی حدود ۴۱.۷ کیلوبایت، با ۷۲۶ گلیف و ۶۵۲ کدپوینت. نسخه ساب ست شده ۲۵۲۷۲ بایت است، یعنی حدود ۲۴.۷ کیلوبایت، با ۵۹۹ گلیف و ۵۲۷ کدپوینت. سه وزنی که این سایت واقعا بارگذاری می کند روی هم ۷۶۳۶۴ بایت می شوند، حدود ۷۴.۶ کیلوبایت.
حالا چیزی که حذف شده، و همین جاست که ساب ست کردن از حدس زدن جدا می شود. ۱۲۵ کدپوینت کم شده و ۱۰۷ تای آنها حرف های لاتین با علامت اند، از آ با ماکرون تا سی با هاچک؛ یعنی الفبای زبان هایی که این سایت به آنها نمی نویسد. پانزده تای دیگر علامت های ترکیبی اند. هیچ حرف فارسی، عربی یا ترکی حذف نشده و حروف مخصوص ترکی هم کامل مانده اند، چون این سایت به چهار زبان نوشته می شود و همه با یک قلم.
و تله ای که بیشتر از هر چیز دیگری در این کار خرابکاری می کند: ساب ست کردن بر اساس «کاراکترهایی که در صفحه استفاده شده اند». روزی که نویسنده کلمه ای بنویسد که حرفی خارج از آن فهرست دارد، آن حرف با قلم دیگری رندر می شود. تله دوم بدتر است و مخصوص خط فارسی: اگر ابزار ساب ست را طوری تنظیم کنید که ویژگی های چیدمان را نگه ندارد، جدول های init و medi و fina با آنها می روند و حروف از هم می افتند. ابزار pyftsubset در حالت پیش فرض مجموعه ای از این ویژگی ها را نگه می دارد؛ خطر وقتی است که کسی فهرست را دستی و بر پایه نیاز لاتین بازنویسی کند.
یک تنظیم دیگر که به اندازه حجم اهمیت دارد: font-display. با swap مرورگر اول قلم جایگزین را نشان می دهد و وسط کار عوض می کند، و همان لحظه چیدمان تکان می خورد. با optional، اگر قلم به موقع نرسید همان جایگزین برای کل آن بازدید می ماند و هیچ سوئیچی رخ نمی دهد. برای فارسی که عرض حروفش با قلم جایگزین خیلی فرق می کند، این تفاوت روی جابه جایی چیدمان بزرگ است.
نیم فاصله دقیقا کجا لازم است؟
نیم فاصله یک کاراکتر نامرئی است، U+200C، که دو بخش یک کلمه را از هم جدا نگه می دارد بدون اینکه فاصله کامل بگذارد. در تایپوگرافی استاندارد فارسی درست است و جایش هم قاعده روشنی دارد.
قاعده این است: نیم فاصله فقط جایی لازم است که حرف آخر ریشه به حرف بعدی می چسبد. اگر ریشه به یکی از حروف ا د ذ ر ز ژ و ختم شود، آن حرف اصلا به بعدی نمی چسبد و شکل جدا خودش را دارد، پس شکل چسبیده از اول درست است و نیم فاصله لازم ندارد. برای همین کارها و بارگذاری و بالاتر درست اند و نباید شکسته شوند، در حالی که شکل استاندارد فعل مضارع، میشود، یک نیم فاصله بین «می» و بقیه دارد.
و اشتباهی که از هر دو حالت بدتر است: حذف کردن نیم فاصله به جای جایگزین کردنش. اگر آن کاراکتر را بردارید و چیزی جایش نگذارید، دو کلمه به هم می چسبند و میشود در می آید که در فارسی معیار غلط است و در اندازه کوچک هم بدخوان. اگر به هر دلیلی نمی خواهید کاراکتر نامرئی در متنتان باشد، جایش یک فاصله معمولی بگذارید و نه هیچ.
موضع خود این سایت را هم صریح بگوییم، چون خواننده اش را روی همین صفحه می بیند: ما در متن های منتشر شده مان به جای نیم فاصله فاصله معمولی می گذاریم، یعنی می شود. این یک انتخاب سرمقاله ای است و نه ادعای درستی زبانی؛ دلیلش این است که کاراکتر نامرئی در متن، هم در جستجو و هم در ابزارهای متنی رفتار غیرقابل پیش بینی دارد و ما ترجیح می دهیم متنمان هیچ چیز نادیدنی نداشته باشد. اگر شما تصمیم دیگری بگیرید و نیم فاصله را نگه دارید، کاملا موجه است؛ چیزی که در هیچ حالتی موجه نیست، شکل چسبیده است.
نکته عملی برای تایپ: در چیدمان استاندارد فارسی، نیم فاصله روی شیفت به اضافه فاصله است. اگر تیم محتوایتان این را نمی داند، متن شما مخلوطی از هر سه حالت خواهد بود و آن بدترین نتیجه ممکن است، چون جستجوی داخلی سایت هم دیگر کلمه ها را پیدا نمی کند.
آیا حرف آخر ریشه به حرف بعدی می چسبد؟
اینجا جای نیم فاصله است
- می + شود
- خانه + ها
- رتبه + بندی
- نوشته + ام
شکل چسبیده از اول درست است
- کارها
- بارگذاری
- بالاتر
- کشورها
عدد فارسی، از دید تایپوگرافی
سه دسته رقم وجود دارد که به هم شبیه اند و یکی نیستند: ارقام لاتین 0 تا 9، ارقام فارسی ۰ تا ۹، و ارقام عربی هندی که در متن عربی به کار می روند. فارسی و عربی هندی در چهار رقم شکل متفاوت دارند و بقیه را مشترک، و همین شباهت باعث می شود اشتباه گرفتنشان راحت باشد.
از دید تایپوگرافی دو چیز مهم است. اول اینکه قلم شما باید ارقام فارسی را واقعا داشته باشد؛ اگر نداشته باشد مرورگر آنها را از یک قلم دیگر قرض می گیرد و در وسط یک جمله، عددها ناگهان ارتفاع و ضخامت متفاوتی پیدا می کنند. این را می شود در سی ثانیه دید: یک عدد فارسی کنار متن بنویسید و از نزدیک نگاه کنید.
دوم، عرض ارقام. در جدول ها و هر جایی که عددها زیر هم می آیند، ارقام باید عرض یکسان داشته باشند تا ستون به هم نریزد. بیشتر قلم های فارسی این را رعایت می کنند ولی همه نه، و راه چکش این است که چند عدد با ارقام مختلف را زیر هم بنویسید و ببینید لبه راستشان یک خط می ماند یا نه.
قلم همین سایت هر سه دسته رقم را دارد، هم لاتین، هم فارسی، هم عربی هندی، و همین است که اجازه می دهد نسخه فارسی و نسخه عربی سایت با یک فایل قلم کار کنند و هر کدام ارقام درست خودشان را داشته باشند.
و یک مرز که این درس عمدا از آن رد نمی شود: عدد فارسی در فرم ها یک مساله جداست و فنی است، نه تایپوگرافیک. الگوهای اعتبارسنجی استاندارد ارقام فارسی را رقم نمی شناسند و اگر برایش فکری نکنید، کاربری که شماره اش را با صفحه کلید فارسی وارد کرده پیام «شماره نامعتبر» می گیرد. آن بحث در اصول طراحی رابط کاربری با راه حلش آمده است.
حرف های عربی که در فارسی غلط اند
فارسی و عربی یک خط مشترک دارند و چند حرف جدا، و همین باعث می شود متن های فارسی پر از حرف های عربی باشند بدون اینکه کسی متوجه شود. مهم ترینشان سه تا هستند: ي عربی به جای ی فارسی، ك عربی به جای ک فارسی، و ة که در فارسی اصلا جایی ندارد و باید ه باشد.
چرا مهم است، وقتی روی صفحه تقریبا یک شکل دیده می شوند؟ چون برای کامپیوتر یک شکل نیستند. جستجوی داخلی سایت شما «کتاب» نوشته شده با کاف فارسی را با همان کلمه نوشته شده با کاف عربی یکی نمی گیرد، مرتب سازی الفبایی به هم می ریزد، و موتور جستجو هم دو رشته متفاوت می بیند. یک صفحه که عنوانش با ی عربی نوشته شده، برای عبارتی که کاربر با ی فارسی جستجو می کند، همان صفحه نیست.
و از دید تایپوگرافی هم اثر دارد: شکل آخر ی فارسی و ي عربی در بیشتر قلم ها متفاوت است، چون یکی دو نقطه دارد و دیگری نه. متنی که مخلوط باشد، در انتهای کلمه ها ناهماهنگ به نظر می رسد و کسی هم نمی فهمد چرا.
دسته دوم، شکل های همزه اند. در فارسی معیار، کلمه هایی مثل تاثیر و مبدا و جزو بدون همزه نوشته می شوند. و اضافه کردن همزه روی ه برای کسره اضافه، یعنی نوشتن خانۀ، شکلی است که در فارسی امروز جای بهتری دارد: فاصله و ی، یا اصلا هیچ.
منشا این حرف ها هم معمولا یک جای مشخص است: صفحه کلید. چیدمان های عربی و بعضی چیدمان های پیش فرض موبایل، حرف عربی تولید می کنند. اگر تیم محتوا دارید، این را یک بار سر جلسه حل کنید و نه صفحه به صفحه؛ مسیر سریع همین درس، دستوری دارد که هر سه دسته را در یک اجرا پیدا می کند.
کشیده و بولد جعلی: دو کاری که نباید کرد
اولی کشیدن حروف با کاراکتر تطویل است، U+0640، که کلمه را به شکل کـــتاب در می آورد. در خوش نویسی، کشیده یک ابزار واقعی و ظریف است و جای مشخصی دارد. در متن وب، تقریبا همیشه برای پر کردن عرض یا هم اندازه کردن دو خط استفاده می شود و همان جاست که به مشکل تبدیل می شود: کلمه دیگر همان رشته نیست، جستجو پیدایش نمی کند، صفحه خوان آن را جور دیگری می خواند، و اگر متن به موبایل برسد کشیدگی ای که برای دسکتاپ تنظیم شده بی معنا می شود.
دومی بولد جعلی است. وقتی قلمی وزن ضخیم ندارد و شما وزن ۷۰۰ می خواهید، مرورگر می تواند خودش حروف را ضخیم کند. برای لاتین نتیجه اش قابل تحمل است؛ برای فارسی نه، چون ضخیم کردن ماشینی، حفره های داخل حروف را پر می کند و نقطه ها را به بدنه می چسباند. راه درست این است که وزن واقعی داشته باشید، و اگر نداشتید تاکید را با اندازه یا رنگ بسازید و نه با وزنی که وجود ندارد.
و سومی که کمتر به عنوان اشتباه شناخته می شود: تراز کردن متن از دو طرف. در فارسی وسوسه اش بیشتر است، چون خط عربی امکان کشیدن دارد و به نظر می رسد می شود بدون فاصله های زشت تراز کرد. ولی مرورگرها این کار را با کشیدن حروف انجام نمی دهند، با باز کردن فاصله بین کلمه ها انجام می دهند، و نتیجه همان رودخانه های سفید است. معیار WCAG هم در بند ۱.۴.۸ صریح می گوید متن نباید از دو طرف تراز شود.
جمع بندی عملی این سه: هر سه شان تلاش برای حل یک مساله چیدمانی با ابزار تایپوگرافی اند. اگر یک بلوک متن بد به نظر می رسد، معمولا جواب عوض کردن عرض ستون یا فاصله سطر است، نه دستکاری خود حروف.
مسیر سریع با هوش مصنوعی
این کار دو نیمه دارد و نیمه اولش اصلا به هوش مصنوعی احتیاج ندارد. حرف های عربی، تطویل و ارقام عربی هندی همه کاراکترهای مشخصی هستند، پس یک دستور grep در چند ثانیه تمامشان را پیدا می کند و هیچ چیزی هم از قلم نمی افتد. نیمه دوم، جای خالی نیم فاصله است و آنجا الگوی متنی به تنهایی کافی نیست، چون تشخیص اینکه «کارها» درست است و شکل چسبیده «رتبه بندی» غلط، به دانستن خود کلمه نیاز دارد. اینجاست که مدل واقعا کاری می کند که ابزار نمی کند.
- متن صفحه ها را در یک فایل متنی بریزید. اگر سایت وردپرسی است، خروجی گرفتن از ابزار Export یا حتی کپی کردن متن چند صفحه مهم کافی است؛ لازم نیست کل پایگاه داده را بیرون بکشید.
- دستور grep زیر را روی همان فایل اجرا کنید. هر خطی که چاپ شود دست کم یک کاراکتر غلط دارد و شماره خطش هم می آید. اگر هیچ چیز چاپ نشد، این نیمه کار تمام است.
- حالا همان متن را با دستور دوم به یک مدل بدهید. برای این کار یک مدل قوی تر بهتر جواب می دهد و نه یک مدل سریع، چون تصمیم درباره هر کلمه یک قضاوت زبانی است؛ انتخاب فعلی ما در <a class="text-link" href="/ai/">بخش هوش مصنوعی</a> نگه داشته می شود.
- خروجی مدل را کلمه به کلمه تایید کنید و جایگزینی سراسری نزنید. این تنها قدمی است که نباید خودکار شود، چون یک جایگزینی اشتباه، همان چیزی است که «کارها» را دو تکه می کند و متن سالم را خراب.
نسخه آماده کپی
قدم اول، بدون هوش مصنوعی. این دستور هر حرف عربی، هر تطویل، هر شکل همزه و هر رقم عربی هندی را در فایل شما پیدا می کند و شماره خطش را می دهد:
grep -nP '[\x{064A}\x{0643}\x{0629}\x{0640}\x{0621}\x{0623}-\x{0625}\x{0654}\x{06C0}\x{0660}-\x{0669}]' FILE
سکوت یعنی تمیز است. هر خروجی یعنی یک مورد که باید دستی درست شود.
قدم دوم، برای مدل:
این متن فارسی است.
{متن}
فقط و فقط کلمه هایی را پیدا کن که جای نیم فاصله در آنها خالی مانده و دو بخش به هم چسبیده اند.
قاعده ای که باید رعایت کنی: نیم فاصله فقط جایی لازم است که حرف آخر ریشه به حرف بعدی بچسبد. اگر ریشه به ا یا د یا ذ یا ر یا ز یا ژ یا و ختم شود، شکل چسبیده درست است و نباید آن را جدا کنی. پس «کارها» و «بارگذاری» و «بالاتر» و «کشورها» همه درست اند.
جواب را به شکل یک فهرست بده: کلمه ای که پیدا کردی، شکل درستش با یک فاصله معمولی، و شماره خط یا جمله ای که در آن بود.
اگر کلمه ای هست که مطمئن نیستی، در یک بخش جدا با عنوان «مطمئن نیستم» بگذار و دلیلش را بنویس. حدس زده را با مطمئن قاطی نکن. هیچ تغییری در متن نده و متن اصلاح شده تحویل نده، فقط فهرست بده.
قبل از اعتماد به خروجی: سه مرز که این مسیر از آنها فراتر نمی رود. اول اینکه grep فقط کاراکتر پیدا می کند و نه معنا: کلمه ای که با حرف درست ولی املای غلط نوشته شده، از این غربال رد می شود. دوم اینکه مدل در فارسی هم اشتباه می کند و مخصوصا سر اسم های خاص و کلمه های قرضی؛ برای همین دستور از او خواسته موارد نامطمئن را جدا کند و شما باید همان بخش را با دقت بیشتری بخوانید. و سوم، مهم تر از هر دو: هیچ وقت خروجی این کار را به شکل یک جایگزینی سراسری روی پایگاه داده سایت اجرا نکنید. یک جایگزینی اشتباه روی صفحه هایی که رتبه دارند، از هر غلط املایی گران تر تمام می شود؛ تغییرها را صفحه به صفحه و با بازبینی انسانی اعمال کنید.
هوش مصنوعی در این کار
موضع ما اینجا از بقیه درس های این مسیر صریح تر است: برای تایپ فارسی، مدل ها را در نقش بازرس متن بگذارید و نه در نقش تولیدکننده تصویر. پیدا کردن حرف عربی، تشخیص جای خالی نیم فاصله و یکدست کردن ارقام، سه کاری است که واقعا خوب انجام می دهند. تولید تصویری که در آن متن فارسی نوشته شده باشد، هنوز کاری است که هیچ کدامشان قابل اتکا انجام نمی دهند و دلیلش را در بخش خطر می گوییم.
ابزارهایی که واقعا کمک می کنند
- Claude برای دستور دوم مسیر سریع مناسب ترین است، چون متن طولانی را یکجا نگه می دارد و وقتی از او بخواهید موارد نامطمئن را جدا کند، واقعا جدا می کند به جای اینکه همه را با یک لحن مطمئن بنویسد. ایران در هیچ کدام از دو فهرست کشورهای پشتیبانی شده انتروپیک نیست و این را روی صفحه خود انتروپیک خوانده ایم.
- Gemini وقتی متن ندارید و فقط یک تصویر از طرح دارید بهتر جواب می دهد: عکس را می خواند و می گوید کجا حروف به هم نچسبیده اند یا ارقام با بقیه جمله هم شکل نیستند. صفحه خود گوگل می نویسد اپ وب جمنای در بیش از دویست و سی کشور و منطقه در دسترس است و ایران در آن فهرست نیست.
- fontTools هوش مصنوعی نیست و همان ابزاری است که عددهای این درس با آن اندازه گیری شده اند. با آن می توانید فهرست ویژگی های یک قلم و فهرست کدپوینت هایش را از خود فایل بخوانید، و همان است که ساب ست کردن را هم انجام می دهد. رایگان است، روی کامپیوتر خودتان اجرا می شود و هیچ فایلی از دستگاه شما بیرون نمی رود.
کجا نتیجه معکوس می دهد
خطر مشخص این حوزه، تصویر است. مدل های تولید تصویر با متن لاتین به جایی رسیده اند، ولی برای فارسی جواب قابل اتکایی ندارند و شواهدش را خود سازنده ها می دهند: هیچ کدام برای «متن داخل تصویر» عددی منتشر نمی کنند و هر کدام یک صفت می نویسند؛ یکی «پیشرفته»، یکی می نویسد هنوز «ممکن است مشکل داشته باشد»، و یکی مدلش را «تخصصی تایپوگرافی» می نامد. سه صفت و صفر اندازه گیری، و هیچ کدام هم اسمی از فارسی نمی برند. این را در جدول بهترین هوش مصنوعی برای ساخت تصویر نوشته ایم و همان جا هم به همین دلیل ستون نشده.
نتیجه عملی: بنر و لوگو و هر تصویری که متن فارسی دارد را با متن تولید نکنید. تصویر را بدون متن بسازید و متن را در ابزار طراحی یا در خود HTML رویش بگذارید. این تنها راهی است که هم حروف درست به هم می چسبند، هم متن قابل جستجو و قابل انتخاب می ماند.
خطر دوم فنی تر است و به بولد جعلی ربط دارد: اگر مدلی برای شما CSS تولید کند و وزنی بخواهد که در قلم شما نیست، مرورگر ضخیم مصنوعی می سازد و در فارسی نتیجه اش بد است. راهش این است که font-synthesis را در CSS خودتان صریح خاموش کنید تا به جای یک نتیجه بد، تفاوت را ببینید و وزن واقعی را اضافه کنید. برای اینکه بدانید هر کدام از این ابزارها از ایران چطور قابل پرداخت است راهنمای خرید را ببینید.
منبع ها: Microsoft: OpenType layout feature tag registry fontTools: the subsetter Anthropic: supported countries Google: where the Gemini web app is available
حد این توصیه
این درس درباره فارسی روی وب است و در چند جا مرز دارد. اول، خوش نویسی: هر چه اینجا آمد درباره حروفی است که یک موتور چیدمان می سازد، و نستعلیق و شکسته دنیای دیگری با قاعده های خودشان اند که در HTML قابل بازسازی نیستند. دوم، ترکیب فارسی و لاتین در یک جمله، که مساله ای دوجهته است و جوابش در چیدمان صفحه است و نه در قلم؛ آن بحث در درس اصول طراحی رابط کاربری آمده. سوم، چاپ، که واحد و فضای رنگی و امکان تنظیم دستی خط در آن فرق می کند. و مرزی که باید صریح گفت: عددهای مربوط به فایل های قلم در این درس، فقط برای قلم همین سایت درست اند و کپی کردنشان به پروژه دیگر چیزی را ثابت نمی کند. روش اندازه گیری قابل تکرار است، خود عددها نه.
از تجربه خود ما
قلم این سایت را با کتابخانه fontTools باز کردیم و دو فایل را کنار هم گذاشتیم. نسخه کامل وزن معمولی ۷۲۶ گلیف و ۶۵۲ کدپوینت دارد و ۴۲۷۰۸ بایت است؛ نسخه ساب ست شده ۵۹۹ گلیف و ۵۲۷ کدپوینت دارد و ۲۵۲۷۲ بایت. تفاوت ۱۲۵ کدپوینت است و وقتی فهرست حذف شده ها را چاپ کردیم، ۱۰۷ تای آنها حرف لاتین با علامت بود و ۱۵ تا علامت ترکیبی. هر دو فایل دقیقا یک مجموعه ویژگی دارند: aalt calt ccmp dlig fina init locl medi rlig salt ss01. یعنی ساب ست جدول های پیوستگی را دست نخورده نگه داشته و همین است که فرق یک ساب ست درست با یک ساب ست خراب را می سازد.
و چیزی که موقع همین اندازه گیری معلوم شد و از قبل نمی دانستیم: هر سه وزنی که سایت بارگذاری می کند دقیقا یک پوشش دارند، ۵۹۹ گلیف و ۵۲۷ کدپوینت، و ترکی هم کامل داخلشان است؛ حروف ı و İ و ş و ğ و ç و ö و ü همه مانده اند. یعنی نسخه ترکی سایت با همان فایلی کار می کند که نسخه فارسی و عربی، و برای اینکه یک قلم به چهار زبان جواب بدهد، تنها چیزی که واقعا قابل حذف بود الفبای زبان هایی بود که این سایت اصلا به آنها نمی نویسد.
سوال هایی که واقعا پرسیده می شوند
یک قلم برای هر چهار زبان کافی است یا برای هر کدام یکی لازم است؟
اگر قلم پوشش داشته باشد، یکی کافی است و بهتر هم هست. سایتی که برای هر زبان یک قلم جدا بارگذاری می کند، هم چند فایل بیشتر می فرستد و هم صفحه هایش شخصیت بصری متفاوتی پیدا می کنند. کاری که باید بکنید این است که قبل از انتخاب، پوشش قلم را برای هر چهار زبان چک کنید؛ روشش در همین درس آمده و پنج دقیقه بیشتر طول نمی کشد.
چطور بفهمم قلمی که دارم ارقام فارسی دارد؟
ساده ترین راه چشمی است: یک عدد فارسی را وسط یک جمله فارسی بنویسید و از نزدیک نگاه کنید. اگر ارتفاع یا ضخامت ارقام با بقیه جمله فرق داشت، قلم آنها را ندارد و مرورگر از جای دیگری قرض گرفته. راه قطعی تر خواندن فهرست کدپوینت های خود فایل با fontTools است، که همان ابزاری است که عددهای این درس با آن اندازه گیری شده.
نیم فاصله را در سایت نگه دارم یا با فاصله معمولی جایگزین کنم؟
هر دو انتخاب دفاع پذیرند و ما خودمان فاصله معمولی را انتخاب کرده ایم، ولی چیزی که واقعا اهمیت دارد یکدست بودن است. سایتی که در آن هر سه شکل پیدا می شود، بدترین حالت است، چون جستجوی داخلی و کوئری های کاربر با هم جور در نمی آیند. یک تصمیم بگیرید، در راهنمای نگارش تیمتان بنویسید، و صفحه های قدیمی را فقط وقتی که به هر دلیلی سراغشان می روید اصلاح کنید و نه با یک اجرای سراسری.