چپبهراست، راستبهچپ و Unicode BiDi
حتماً تا بهحال براتون پیش اومده که وسط یه متن فارسی، یک متن انگلیسی مینویسید و همهچیز قاطی میشه. مخصوصاً توی محیطهای Plain Text (یعنی محیطهای متنیای که شما کنترلی روی استایل و پاراگراف ندارید. مثل gedit یا kate یا مثلاً notepad). خیلی زود متوجه خواهید شد که روش سادهای برای نوشتن کاراکترهایی که نه راستبهچپ هستن و نه چپبهراست هستن، وجود نداره (در ادامه میگم که جهت یک کاراکتر یعنی چی). توی این پست میخوام روش استاندارد نوشتن متون دوطرفه رو معرفی کنم، و تأکید کنم که حتماً ازش استفاده کنید و هیچوقت بهجای اینکار از هکهای متداول (مثل برعکس نوشتن ترتیب نویسهها) استفاده نکنید چون این کار خیلی غلطه.
نویسههای یونیکد از لحاظ جهتگیری به چهار دستهٔ خنثی، راستبهچپ، چپبهراست و ضعیف تقسیمبندی میشن. نویسههای چپبهراست نویسههایی هستند که همیشه باید چپبهراست نمایش داده بشن. مثل حروف الفبای لاتین. نویسههای راستبهچپ هم دقیقاً برعکس اینها هستند. مثل حروف الفبای عربی. یک دسته از نویسهها هم هستند که جهت براشون معنی نداره. مثلاً نویسهٔ نوسطر یا نویسههایی که دیده نمیشن (مثل نویسههای کنترلی) اینها نویسههای خنثی هستند. خوب تا اینجا همهچیز خوب بود اما وقتی مشکل بزرگ بهوجود میاد که به نویسههای ضعیف برخورد میکنیم. نویسهٔ ضعیف نویسهاییه که براساس جاگیریش بین نویسههای دیگه میتونه راستبهچپ یا چپبهراست باشه. مثل نویسهٔ + یا مثلاً ™.
خوب این نویسههای ضعیف متن رو خراب میکنن. چینشهایی از متن دوطرف وجود داره که از لحاظ منطقی الگوریتمی برای تعیین جهت یک سری نویسهٔ ضعیف توشون وجود نداره. مثلاً چطور؟ فرض کنید وسط یک متن فارسی بنویسم C++. همونطور که میبینید دو تا + رفتن به سمت چپ نویسهٔ C در حالی که منظور من اومدن اونها به سمت راست بوده. در واقع من اول کلید C رو زدم، بعد دو بار کلید + رو فشار دادم. اما اگر جهت متن رو عوض کنم، یعنی توی این کد HTML یه تگ dir=ltr بنویسم، اونوقت نوشتههای فارسیم در جهتهای معکوس نشون داده میشن. برای این که مشکل رو ببینید میتونید این ویدئو رو ببینید (اگر به هر دلیلی اینترنت آزاد ندارید، میتونید از اینجا ببینید):
همونطور که گفتم الگوریتمی برای اصلاح خودکار جهتها نمیتونه وجود داشته باشه. چون کاربر ممکنه هرکدوم از حالتها مدنظرش باشه. برای اصلاح جهتها یک سری نویسههای کنترلی وجود داره. (نویسههایی که شما اونها رو نمیبینید ولی مثل یک کاراکتر معمولی هستند). با استفاده از این نویسهها میشه خیلی راحت متن رو تنظیم کرد. طوری که متون راستبهچپ وسط متون چپبهراست قاطی نشن و برعکس.
برای استفاده از این نویسهها کافیه که متن خودتون رو بین یک جفت نویسهٔ کنترلی قرار بدید. برای این کار روشهای مختلفی وجود داره. راحتترین روش استفاده از صفحهکلید استاندارد فارسی هست که آخر از همه میگم چطوریه (: اول باید توضیح بدم که چطور کار میکنه.
طرز کار
۱. اگر میخواهید وسط یک متن راستبهچپ، یک متن چپبهراست بنویسید، یک نویسهٔ
Left-to-Right Embedding
(کد U+202A
) قبل از متن چپبهراست و یک نویسهٔ
Pop Directional Format
(کد U+202C
) بعد از متن چپبهراست قرار بدید.
۲. اگر میخواهید وسط یک متن راستبهچپ، یک متن چپبهراست بنویسید، یک نویسهٔ
Right-to-Left Embedding
(کد U+202B
) قبل از متن چپبهراست و یک نویسهٔ
Pop Directional Format
(کد U+202C
) بعد از متن چپبهراست قرار بدید.
مثلاً عبارت من C++ هستم به این صورت توی حافظه ذخیره میشه:
0xd985 // ARABIC LETTER MEEM
0xd986 // ARABIC LETTER NOON
0x0020 // SPACE
0x8207 // LETF-TO-RIGHT EMBEDDING
0x0067 // C
0x0043 // +
0x0043 // +
0x8236 // POP-DIRECTIONAL FORMAT
0x0020 // SPACE
0xd987 // ARABIC LETTER HEH
0xd8b3 //ARABIC LETTER SEEN
0xd8aa //ARABIC LETTER TEH
0xd985 // ARABIC LETTER MEEM
تایپ کردن
اگر صفحهکلید استاندارد فارسی استفاده میکنید کارتون خیلی راحته. (اگر کاربر یکی از توزیعهای گنو/لینوکس باشید، صفحهکلید پیشفرضتون همین چینش صفحهکلید استاندارد خواهد بود.)
- برای درج نویسهٔ RLE از کلید
Alt
سمت راست بههمراه ]
(چ
فارسی) استفاده کنید. - برای درج نویسهٔ LRE از کلید
Alt
سمت راست بههمراه [
(ج
فارسی) استفاده کنید - برای درج نویسهٔ PDF از کلید
Alt
سمت راست بههمراه P
(ح
فارسی) استفاده کنید
به همین راحتی! به یاد داشتن جای این کلیدها هم خیلی آسونه:
میتونید ویدئوی مربوط به تایپ کردن صحیح رو هم اینجا ببنید: (بازم اگر به هر دلیلی اینترنت آزاد ندارید، میتونید از اینجا ببینید)
اگر کاربر ویندوز هستید بهتره ویندوز رو پاک کنید و یه سیستمعامل آزاد نصب کنید. اگر رئیستون این اجازه رو نمیده، میتونید چینش استاندارد فارسی برای ویندوز رو نصب کنید و البته فراموش نکنید که چینش احمقانهٔ مندرآورُدیِ مایکروسافت رو هم غیرفعال کنید.
کدهای HTML
معمولاً توسعهدهندههای وب گرامی وقتی میخوان یک متنی با جهت مخالف رو بین یک
متن دیگه قرار بدن، دو تا کار انجام میدن. یا کلاً بیخیال قضیه میشن و همهچیز به
شکلی زشت و آزاردهنده دیده میشه، یا اینکه هک خودشون رو اختراع میکنن. در این
مورد استفاده از تگهای <span>
و بازنویسی جهت استفاده میشه. این خیلی بده. وقتی
توی یک صفحهٔ HTML قرار باشه از متون دوجهته استفاده بشه، باید از همین روش
بالا استفاده کنید. کدهای HTML برای نویسههای کنترلی اینطوری هستند:
- برای درج نویسهٔ RLE از کد
‏
و یا بهتر از اون ‏
استفاده کنید. - برای درج نویسهٔ LRE از کد
‎
و یا بهتر از اون ‎
استفاده کنید. - برای درج نویسهٔ PDF از کد
‬
استفاده کنید.