سروش ربیعی
سروش ربیعی
خواندن ۴ دقیقه·۵ سال پیش

درست‌نویسی متون دوجهته


حتماً تا به‌حال براتون پیش اومده که وسط یه متن فارسی، یک متن انگلیسی می‌نویسید و همه‌چیز قاطی میشه. مخصوصاً توی محیط‌های Plain Text (یعنی محیط‌های متنی‌ای که شما کنترلی روی استایل و پاراگراف ندارید. مثل gedit یا kate یا مثلاً notepad توی ویندوز). خیلی زود متوجه خواهید شد که روش ساده‌ای برای نوشتن کاراکترهایی که به‌طور ذاتی راست‌به‌چپ هستن و یا چپ‌به‌راست نیستند، وجود نداره (در ادامه میگم که جهت یک کاراکتر یعنی چی). توی این پست می‌خوام روش استاندارد نوشتن متون دوطرفه رو معرفی کنم، و تأکید کنم که حتماً ازش استفاده کنید و هیچوقت به‌جای این‌کار از هک‌های متداول (مثل برعکس نوشتن ترتیب نویسه‌ها) استفاده نکنید چون این کار خیلی غلطه و متن شما رو از لحاظ محتوایی دچار ضعف می‌کنه. یعنی مثلا توی جستجوها متنی که خراب نوشتید پیدا نمیشه.

صورت مسأله

نویسه‌های یونیکد از لحاظ جهت‌گیری به چهار دستهٔ خنثی، راست‌به‌چپ، چپ‌به‌راست و ضعیف تقسیم‌بندی میشن. نویسه‌های چپ‌به‌راست نویسه‌هایی هستند که همیشه باید چپ‌به‌راست نمایش داده بشن. مثل حروف الفبای لاتین. نویسه‌های راست‌به‌چپ هم دقیقاً برعکس این‌ها هستند. مثل حروف الفبای عربی. یک دسته از نویسه‌ها هم هستند که جهت براشون معنی نداره. مثلاً نویسهٔ نوسطر یا نویسه‌هایی که دیده نمیشن (مثل نویسه‌های کنترلی) این‌ها نویسه‌های خنثی هستند. خوب تا این‌جا همه‌چیز خوب بود... مشکل بزرگ اما زمانی به‌وجود میاد که به نویسه‌های ضعیف برخورد می‌کنیم. نویسهٔ ضعیف نویسه‌ای هست که براساس جاگیری‌ش بین نویسه‌های دیگه می‌تونه راست‌به‌چپ یا چپ‌به‌راست باشه. مثل نویسهٔ + یا - یا ( و ) و از این قبیل نشانه‌ها.

خوب این نویسه‌های ضعیف متن رو خراب می‌کنن. چینش‌هایی از متن دوطرف وجود داره که از لحاظ منطقی الگوریتمی برای تعیین جهت یک سری نویسهٔ ضعیف توشون وجود نداره. مثلاً چطور؟ فرض کنید وسط یک متن فارسی بنویسم C++. همون‌طور که می‌بینید دو تا + رفتن به سمت چپ نویسهٔ C در حالی که منظور من اومدن اون‌ها به سمت راست بوده. در واقع من اول کلید C رو زدم، بعد دو بار کلید + رو فشار دادم. اما اگر جهت متن رو عوض کنم، یعنی توی این کد HTML یه تگ dir=ltr بنویسم، اونوقت نوشته‌های فارسی‌م در جهت‌های معکوس نشون داده میشن. برای این که مشکل رو (که قطعاً بهش برخورد کردید) مشاهده کنید؛ عکس‌های زیر رو ببینید:

جهت نادرست متون انگلیسی میان فارسی و فارسی میان انگلیسی
جهت نادرست متون انگلیسی میان فارسی و فارسی میان انگلیسی

در این عکس من این عبارت‌ها رو نوشتم:

خط اول: «متن فارسی که در میان آن ‪C++‬ نوشته شده است.»
خط دوم: « ‫Computer به وسیله‌ای گفته می‌شود که با آن Calculation انجام می‌دهند‬» (چقدر لوس!)

ولی همون‌طور که ملاحظه می‌کنید نمایش متون درست نیست.

اثبات می‌شود که الگوریتمی جامع برای کنترل جهت خودکار نویسه‌های ضعیف وجود ندارد. چون کاربر ممکنه هرکدوم از حالت‌ها مدنظرش باشه. برای همین؛ جهت اصلاح سوگیری نویسه‌ها؛ یک سری نویسه‌های کنترلی وجود داره. (نویسه‌هایی که شما اون‌ها رو نمی‌بینید ولی مثل یک کاراکتر معمولی هستند). با استفاده از این نویسه‌ها میشه خیلی راحت متن رو تنظیم کرد. طوری که متون راست‌به‌چپ وسط متون چپ‌به‌راست قاطی نشن و برعکس. درست مثل این عکس:

جهت‌گیری درست نویسه‌ها در محیط دوجهته
جهت‌گیری درست نویسه‌ها در محیط دوجهته

برای استفاده از این نویسه‌ها کافیه که متن خودتون رو بین یک جفت نویسهٔ کنترلی قرار بدید. برای این کار روش‌های مختلفی وجود داره. راحت‌ترین روش استفاده از صفحه‌کلید استاندارد فارسی هست که در انتها توضیح میدم چطوریه. اول باید بگم که چطور کار می‌کنه.

طرز کار

۱. اگر می‌خواهید وسط یک متن راست‌به‌چپ، یک متن چپ‌به‌راست بنویسید، یک نویسهٔ 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‬ (ح فارسی) استفاده کنید

به همین راحتی! به یاد داشتن جای این کلیدها هم خیلی آسونه:

جای کاراکترهای کنترلی
جای کاراکترهای کنترلی

اگر کاربر ویندوز هستید بهتره ویندوز رو پاک کنید و یه سیستم‌عامل آزاد نصب کنید. اگر رئیس‌تون این اجازه رو نمیده، می‌تونید چینش استاندارد فارسی برای ویندوز رو نصب کنید و البته فراموش نکنید که چینش احمقانهٔ من‌درآورُدیِ مایکروسافت رو هم غیرفعال کنید.

یادداشتی برای توسعه‌دهندگان وب فارسی!

معمولاً توسعه‌دهنده‌های وب وقتی می‌خوان یک متنی با جهت مخالف رو بین یک متن دیگه قرار بدن، دو کار انجام میدن: یا کلاً بی‌خیال قضیه میشن و همه‌چیز به شکلی زشت و آزاردهنده دیده میشه، یا اینکه هک خودشون رو اختراع می‌کنن. در حالت دوم (هک) استفاده از تگ‌های <span> و بازنویسی جهت استفاده میشه. این خیلی بده! وقتی توی یک صفحهٔ HTML قرار باشه از متون دوجهته استفاده بشه، باید از همین روش بالا استفاده کنید. کدهای HTML برای نویسه‌های کنترلی این‌طوری هستند:

  • برای درج نویسهٔ RLE از کد ‪&#8207;‬ و یا بهتر از اون ‪&rlm;‬ استفاده کنید.
  • برای درج نویسهٔ LRE از کد ‪&#8206;‬ و یا بهتر از اون ‪&lrm;‬ استفاده کنید.
  • برای درج نویسهٔ PDF از کد ‪&#8236;‬ استفاده کنید.
فارسی‌نویسیدرست‌نویسیbidiیونیکدunicode
برنامه‌نویس سیستم / سی، سی‌پلاس‌پلاس / لینوکس
شاید از این پست‌ها خوشتان بیاید