فارسی نوشتن (یا کاملتر بگیم ابجد نوشتن) با یک سری چالش همراهه مخصوصا اگر ادیتورتون ساپورتش برای زبان های ابجد و Right-to-left خیلی خوب نباشه، که خب اکثر ادیتور های تحت وب همینطوری هستن، مثل بخش نظرات سایت ها و غیره. مشکلاتی پیش میاد مثل برعکس شدن متنهای مرکب از حروف لاتین و ابجد و همینطور آمدن علامت های سوال (؟)، تعجب (!) و نقطه (.) سر جمله! یا این که با اینکه بعد هر کلمه اسپیس میزنی بازم تو نتیجه میبینی که کلمه هات به هم چسبیدن! تو این پست تا جایی که دانشم راه بده میگم که چطور میشه با استفاده از یه سری کاراکتر یونیکود این مشکلات رو حل کنیم!
فهرست
مثال مقدمه و تعاریف ۱- جهتگیری (Directionality) ۲- کاراکتر بلاک (Chacacter Block) ۳- انواع کاراکتر های غیر چاپی (Non-printing characters) کاراکتر های Mark کاراکتر های Embedding کاراکتر های Override زمین بازی طرز کار در کیبورد لینوکس طرز کار در کیبورد ویندوز ۱- جدول کاراکتر های ذکر شده در ویندوز
مثال
این متن رو ببینین: سلام! من یک متن فارسی هستم!
حالا این یکی: سلام! من یک متن فارسی هستم!
متن اول علامت تعجبش اومده سر جمله! بعضا پیش میاد، ولی متن دوم علامت تعجب ته جملست به شکل مطلوب، چرا؟ چون اول جمله یک کاراکتر 202B اضافه تر داره! به کاراکتر های مشابه این میگیم کاراکتر های غیر چاپی یا non-printing characters، کاراکتر های دیگری هم هستن که میتونن متن رو برامون راستچین کنن، چپچین کنن، برش گردونن، ترتیب کاراکتر بلاک هارو عوض کنن و هزار تا چیز دیگه. این مطلب هدفش آشنایی با این کاراکتر هاست; تمام این کاراکتر ها به شکل پیشفرض در کیبرد های لینوکسی (یا حداقل اکثرشون) موجودن ولی برای ویندوز باید به شکل دستی اضافشون کرد که آموزشش رو در انتهای مطلب گذاشتم. این مطلب رو پس از پاسخ به یه دوست هموطن تو Stackoverflow نوشتم چون به ذهنم خطور کرد که شاید خیلیا واقعا بتونن ازش استفاده کنن.
مقدمه و تعاریف
۱- جهتگیری (Directionality):
کاراکتر ها یک ویژگی ذاتی به نام جهتگیری (directionality) دارند. مثلاً کاراکتر های لاتین جهتگیری چپبهراست (LTR: Left-to-right) و کاراکتر های فارسی جهتگیری راستبهچپ (RTL: Right-to-left)، برخی کاراکتر ها هم جهتگیری خنثی دارند مثل نقطه (.) و درنگ (،).
وقتی ما تعدادی حرف از نوع RTL را کنار هم میچینیم نوشته ما راست به چپ نوشته خواهد شد و وقتی تعدادی حرف از نوع LTR کنار هم میچینیم نوشته ما چپ به راست خواهد بود. خب پَنَپَ!
۲- کاراکتر بلاک (Character Block):
به کاراکتر های کنار همی که جهتگیری یکسانی دارند میگویند کاراکتر بلاک! مثلاً در تصویر بعدی ۷ کاراکتر بلاک داریم.
۳- انواع کاراکتر های غیر چاپی
سه دستشون اینجا مهم هستن: ۱- Mark، ۲- Embedding، ۳- Override
کاراکتر های Mark
۱- 200F: Right-To-Left Mark
این کاراکتر در ذات خودش جهتگیری راست به چپ داره اما هیچ نمود دیداریای نداره! کاربرد مهمش اینه که میتونیم کنار یه کاراکتر خنثی مثل نقطه بنویسیمش تا جهتگیری کاراکتر بلاکی که اون نقطه جزوش هست رو تغییر بده.
متنی ساده که وارد بخش پاسخ های stackexchange شده.
همان متن بالا با این تفاوت که پس از علامت تعجب از 200F استفاده شده.
۲- 200E: Left-to-right-mark
این کاراکتر در ذات خودش جهتگیری چپ به راست داره و مثل بقیه کاراکتر ها هیچ نمود دیداریای نداره! کاربرد مهمش اینه که میتونیم کنار یه کاراکتر خنثی مثل نقطه بنویسیمش تا جهتگیری کاراکتر بلاکی که اون نقطه جزوی ازش هست رو تغییر بده!
در تصویر بعد تفاوت جمله پایین و بالا صرفاً وجود یک 200E پس از نقطه آخر جمله انگلیسی است.
استفاده از 200E پس از نقطه آخر جمله
نسخه خام متن در vscodium برای درک بهتر
کاراکتر های Embedding
۱- کاراکتر 202B: Right-to-left Embedding
کاراکتر اول 202B بود که تو همون مثال بالا باهاش آشنا شدیم، کارش اینه که بند (Paragraph) رو راست چین کنه، یا دقیق تر بگم، کاری کنه که کاراکتر بلاک ها با ترتیب راست به چپ نوشته بشن. مثال کاربردی مهمش زمانیه که میخوایم یک لیست عددی درست کنیم از کلماتی که بعضیاشون فارسی و بعضیاشون انگلیسین، برای اینکه این لیستمون تمیز و درست در بیاد قبل نوشتن کلمه انگلیسی (قبل عدد هم میشه) یک 202B اضافه میکنیم.
در خط دوم قبل هر عدد یک 202B اضافه شده
نسخه خام متن بالا در vscodium برای درک بهتر
پ.ن: کاربرد فرعی ولی مهم 202B
یه کاربرد دیگه که برای من به شخصه داشته این بوده که وقتی میخوام متن انگلیسی بنویسم ولی سمت راست تکست ادیتورم بیاد (تکست ادیتورای ساده مثل Gedit و KWrite و Notepad و یا تکست ادیتور های تحت وب تو سایتای مختلف)، ازش استفاده میکنم، قبل پاراگراف مینویسمش و متنم راست به چپ میشه، در این کاربری خاص البته فرقی نداره که 200F استفاده بشه یا 202B، یه نمونش اینه:
عدم استفاده از 202B قبل ردیف ۳ و ۴
استفاده از 202B قبل ردیف ۳ و ۴
کاربرد دیگش اینه که بعضی ادیتورا کلهم راست چین ندارن، مثالش همین سامانه های معیوب دولتی/دانشگاهی که کلهم چپ چینن و متنتون رو این شکلی تحویلتون میدن:
مطالب upload شدند.
که خب راه حل اینه که سر جمله از 202B استفاده کنیم (بعضا هم لازم قبل هر کلمه ازش استفاده کنیم):
مطالب upload شدند.
۲- کاراکتر 202A: Left-to-right Embedding
در تصویر پیشرو من با استفاده از کاراکتر 202A قبل از هر کلمه جهتگیریش در غالب پاراگراف رو به چپبهراست تغییر دادم و اینطوری شد که تونستم با استفاده از حروف فارسی، عبارت ریاضی چپبهراست بنویسم:
در جمله سوم پیش از هر کلمه یک 202A قرار داده شده
نسخه خام متن بالا در vscodium برای درک بهتر
۳- کاراکتر 202C: Pop Directional Formatting یا PDF
این کاراکتر نشانگر پایان یک بخش embedded هست، تصور کنید در یک متن میخوام به شکل متوالی از کاراکتر های 202A و 202B استفاده کنیم، هرجایی که لازم باشه محدوده راستبهچپ یا چپبهراست ناشی از یکی از کاراکتر های embedding رو تموم کنیم از این کاراکتر PDF یا 202C استفاده میکنیم. من تو همین پست وبلاگم یکم پایین تر ازش استفاده کردم که متن دقیقش رو اینجا میذارم. تو این متن هدفم این بود که کلمه .exe چپبهراست باشه که نقطهاش قبل کلمه بیاد ولی باقی جملم راست به چپ باشه، یعنی چی؟ یعنی من میخوام وسط یک پاراگراف راستبهچپ، یک کاراکتر بلاک واحد چپبهراست داشته باشم.
در تصویر پیش رو جمله اول خام است، جمله دوم یک 202A دارد که بر خلاف میل ما تمام ادامه پاراگراف را چپبهراست کرده، جمله سوم اما به درستی درش صرفاً یک کاراکتر بلاک چپبهراست و بقیه راستبه چپ اند.
متن بالا داخل ادیتور
نسخه خام متن در vscodium برای درک بهتر
کاراکتر های Override
۱- کاراکتر های 202D و 202E
کاراکتر های override خیلی کاربردی ندارن ولی کیوت ترین کاراکتر های غیر چاپی همینان! کارشون اینه که قبل هر پاراگرافی بیان جهتگیری تمامی کاراکتر های اون پاراگراف رو عوض میکنن! یعنی اگر قبل کلمه “سلام” یه 202D بذاری میشه “مالس” (202D: Right-to-left override). و اگر قبل کلمه “Hello” یه 202E بذاری میشه “olleH” (202D: Left-to-right override). خیلیم عالی! براشون فقط دوتا کاربرد پیدا کردم! یه کاربردش بامبول بازی هست که تصاویرشو پایین میبینین و کاربرد بعدی یه کاربرد شیطانیه که جلوتر میگم!
استفاده از کاراکتر های اورراید پیش از کلمات جهت بامبول بازی!
نسخه خام متن در vscodium برای درک بهتر
۲- کاربرد شیطانی کاراکتر های override!
به فایل زیر نگاه کن! دقیق تر نگاه کن! چی میبینی؟ یه فایل png بی آزار نه؟
تصویر یک عکس بی آزار!
ولی نهههه! این یک فایل اجرایی ویندوز هست! یک فایل .exe هست!
پشت صحنه عکس بی آزار!
حالا بذارید متن خام اسم فایل رو بهتون نشون بدم!
متن خام اسم فایل در vscodium
این یکی از کاربرد های شیطانی هست که کاراکتر 202E داره! باهاش میشه کاری کرد که فایل اجرایی (که احتمالا مخربه!) رو کاریش کنیم شبیه فایل عکس شه 🙂 البته این روش قدیمی شده و رو ویندوزای جدید معمولا پسوند فایل مخفیه و حتی اگر مخفی نباشه هم نمیشه فایلی درست کرد که هم مخرب باشه و هم دسترسی ادمین نخواد و هم آیکونش با فایل تصویری مو نزنه و هم آنتی ویروس نشناستش!
زمین بازی
اینجا یه زمین بازی براتون درست کردم که با کاراکتر ها کار کنید و طیاش عمیق تر کاربرداشونو درک کنین.
طرز کار در کیبورد لینوکس
در اکثر کیبورد های لینوکسی ما به شکل پیشفرض این کاراکتر ها رو داریم و در جدول زیر محل کاراکتر ها در کیبورد رو نوشتم:
محل روی کیبورد
کاراکتر
Alt + 0
200F
Alt + 9
200E
Alt + ]
202B
Alt + [
202A
Alt + p
202C
Alt + i
202D
Alt + o
202E
طرز کار در کیبورد ویندوز
برای نوشتن این کاراکتر ها در ویندوز ۲ راه وجود داره، راه اول اینه که کلید Alt رو بگیرید و کد یونیکود کاراکترتون رو با استفاده از numpad کیبورد بنویسید (جدول پایین) و راه بعدی اینه که کاراکتر مورد نظرتون رو مطابق این آموزش خود سایت مایکروسافت به کیبورد اضافه کنید: Insert ASCII or Unicode Latin-based symbols and characters
جدول کاراکتر های ذکر شده در ویندوز
محل روی کیبورد
کاراکتر
Alt + 8207
200F
Alt + 8206
200E
Alt + 8235
202B
Alt + 8234
202A
Alt + 8236
202C
Alt + 8237
202D
Alt + 8238
202E
سخن پایانی
ممنونم که پستم رو خوندید، اگر جایی اشتباهی دیدید یا پیشنهادی برای بهتر شدن این پست یا کلاً هر جایی از بلاگم دارید ممنون میشم کامنت بذارید یا از ایمیل با من در ارتباط باشید.
خیلی عالی و کاربردی و خفن👍👍👍
مرسی عزیزم!
بسیار عالیی
خیلی متشکرم، امیدوارم کاربردی بوده باشه. 😀