مشکل بهم ریختگی متون فارسی انگلیسی در کامپیوتر
March 2, 2009 18 Comments
امروز واقعا از اینکه بیش از چهار سال است طراحی وب میکنم از خودم خجالت کشیدم واز اینکه وقتم رو خیلی وقتها بیهوده از دست دادم تاسف خوردم. امروز هم مثل سایر روزها توی شرکت مشغول کار بودیم که افشار محبی متوجه نکته بسیار مهمی شد.
خیلی وقتها شما در فرمهای کامپیوتری مشکل بزرگی دارید و آن این است که خیلی از برنامهها فرم ورود اطلاعات راست به چپ را پیاده سازی نکردهاند و وقتی شما یک متن فارسی را با انگلیسی با هم در یک جمله بکار می برید جمله شما هر وقت که به کلمه انگلیسی میرسد، بجای اینکه کلمه انگلیسی را سمت چپ جمله قرار بدهد، آن را سمت راست نوشتار قرار میدهد به شکل زیر
این یک جلمه به زیان فارسی است که کلمات English در آن باعث Break در جمله میشود
نمونه بالا بخصوص در متن ای-میلها به چشم میخورد. اگر بخواهیم مشکل بالا را رفع کنیم یک راه کوچه بازاری آن است که در هر بار مطالعه متن حالت TextBox حاوی نوشتار را به RTL تغییر دهیم و یا Text-Align نوشتار را به سمت راست بیاوریم. در نگاه اول شاید مشکل حل شده باشد اما واقعیت آن است که این دردسر بزرگ به این راحتیها قابل حل نیست مگر اینکه از یونیکد استفاده کنید.
برای رفع مشکل بالا کافی است یک قالب کیبورد استاندارد فارسی ( در حال حاضر بالاترین نسخه قالب کیبورد فارسی، ISIRI 9147 است، که میتوانید آن را از این آدرس دانلود کنید، قبلا یک مطلب برای نصب این قالب کیبورد نوشتم که در مطالب مرتبط با یونیکد هست و میتوانید آن را از آرشیو وبلاگ پیدا کنید) بر روی سیستمتان نصب کنید. پس از نصب ماتصا ۹۱۴۷ باید از کاراکترهای ویژه که باعث پیاده سازی الگوریتمهای دوجهته ( Bidirectional Algorithm ) میشود استفاده کنید.
در استاندارد یونیکد کاراکترهایی هستند که دوجهته محسوب میشوند مثل پرانتزها و غیره، این کاراکترها چون در همه زبانها کاربرد دارند یکبار پیاده سازی شدند، جهت نوشتار تعیین کننده نوع نمایش این کاراکترهاست، برای مثال پرانتز وقتی در متن انگلیسی نوشته میشود با این صورت ) باز میشود و به این صورت ( بسته و در فارسی به این صورت ( باز میشود و به این صورت ) بسته.
این توضیحات برای این بود تا درک دقیقی از کارایی الگوریتم دوجهته داشته باشید، حالا بماند که این الگوریتم دوجهته در نسخههای قدیمی ویندوز ( پیش از ویستا ) درست پیادهسازی نشده بود و در برنامهها باعث وقوع مشکلاغت بسیاری میشد که خود ما در شرکت فراکنش در حال بررسی و رفع این مشکل هستیم و مطلب قبلی هم که مراجعی برای پیگیری یونیکد بود، برای برطرف کردن همین مشکلات بود که هنوز به شکل دلخواه ما مرتفع نشده و در حال بررسی هستیم.
اما از موضوع دور نشویم برای رفع مشکل بهم ریختگی نوشتار فارسی در جملات LTR کافی است از کاراکترهای ویژه الگوریتم دوجهته استفاده کنید. استاندارد یونیکد در ضمیمه شماره ۹ خود به این الگوریتم پرداخته و توضیحات جامع و کافی در این مورد داده که اگر علاقهمند بودید میتوانید در اینجا اینجا متن کامل آن را مطالعه کنید.
طبق این استاندارد هروقت که شما در یک متن مایل بودید که راست به چپ بنویسید باید در ابتدای جمله کاراکتر زیر متن راست به چپ یا RLE را قرار بدهید. پیش از ادامه لازم میدانم که این کاراکترها را معرفی کنم.
نشانه چپ به راست که در یونیکد با نام LRM و با کد 200E شناخته میشود
نشانه راست به چپ که در یونیکد با نام RLM و با کد 200F شناخته میشود
زیر متن چپ به راست که در یونیکد با نام LRE و با کد 202A شناخته میشود
زیر متن راست به چپ که در یونیکد با نام RLE و با کد 202B شناخته میشود
زیر متن اکیدا چپ به راست که در یونیکد با نام LRO و با کد 202D شناخته میشود
زیر متن اکیدا راست به چپ که در یونیکد با نام RLO و با کد 202E شناخته میشود
پایان زیر متن که در یونیکد با نام PDF و با کد 202C شناخته میشود
کاراکتر RLM پیش از یک کاراکتر دو جهته می نشیند و آن کاراکتر را بصورت راست به چپ نشان میدهد.
کاراکتر LRM پیش از یک کاراکتر دوجهته مینشیند و آن کاراکتر را بصورت چپ به راست نشان میدهد.
کاراکتر RLE پیش از یک جمله که دارای کلمات دوزبانه است مینشیند و جمله را کاملا بصورت راست به چپ نشان میدهد درست مثل زمانی که در برنامه Word روی نماد راست به چپ کلیک میکنید. برای رفع مشکل بالا هم باید از همین کاراکتر استفاده کرد. توجه داشته باشید که این کاراکتر صرفا جهت نوشتار را تعیین میکند و جهت قرارگیری جمله Txt-Align را تغییر نمیدهد بنابراین جمله شما با اینکه راست به چپ قابل خواندن است، ولی کماکان به سمت چپ TextBox خواهد چسبید.
کاراکتر LRE پیش از یک جمله که دارای کلمات دوزبانه است مینشیند و جمله را کاملا بصورت چپ به راست نشان میدهد درست مثل زمانی که در برنامه Word روی نماد راست به چپ کلیک میکنید.
کاراکتر RLO پیش از یک جمله که دارای کلمات دوزبانه است مینشیند و جمله را کاملا بصورت راست به چپ نشان میدهد. تفاوت RLO با RLE در آنجاست که RLE با کاراکترهای کلمات انگلیسی کاری ندارد، ولی RLO همه جمله را میچرخاند کلمات فارسی درست در سمت راست قرار میگیرند و کلمات انگلیسی برعکس میشوند مثلا اگر کلمه WhatsHappen را با RLO نشان دهید این کلمه تبدیل میشود به neppaHstahW
کاراکتر LRO هم درست برعکس RLO کار میکند و همه کاراکترها را به سمت چپ میچرخاند.
کاراکتر PDF در انتهای جمله شما که ممکن است چند پاراگراف یا حتی یک کتاب !!! باشد قرار میگیرد و مشخص میکند که به انتهای محدوده مورد نظر رسیدیم، مثلا اگر شما محدودهای را RLE مشخص کردید و حالا میخواهید LRE بنویسید باید انتهای محدوده را با PDF مشخص کنید.
با توجه به مطالب گفته شده در بالا، برای تصحیح جمله بالا باید پیش از آنکه اقدام به نوشتن جمله کنید، ابتدا یک کاراکتر RLE که در استاندارد ISIRI 9147 بر روی کلید [+Alt قرار گرفته را تایپ کرده و سپس اقدام به نگارش جمله کنید. به این ترتیب جمله بالا به این شمل نشان داده خواهد شد
این یک جلمه به زیان فارسی است که کلمات English در آن باعث Break در جمله میشود
در نگارش این مطلب و درواقع مشخص شدن راه حل افشار محبی از همکاران من در شرکت فراکنش راهنماییهای بسیار خوبی کرد که همینجا از او قدردانی میکنم.
لینکهای مرتبط
ضمیمه شماره ۹ استانداراد یونیکد در مورد الگوریتمهای دوجهته
thanks
این مشکل را در ام اس ورد چگونه می توان حل کرد؟ آنجا هم هنگامی که کلمات انگلیسی را با متن فارسی مخلوط میکنیم نظمشان به هم می خورد.
در آن برنامههم با همین روش میتوان قضیه را حل کرد. ولی با ابزار راست به چپ که در خود برنامه هست لزومی به این کار نیست.
خواستم از متنت تشکر کنم، چون امشب خیلی به دردم خورد، از متنت استفاده کردم.
مشکل من برای تایپ یک کد بود که به صورت تعدادی عدد که با / از هم جدا شده بودند و در این بین یک حرف فارسی هم میومد.
با استفاده از متنت تونستم با گذاشتن یه دونه LRO و بعد از اون RLM مشکلم رو حل کنم، حالا دیگه کد ها درست نمایش داده میشه. خواستم بابت متنهایی که توی وبلاگت در مورد یونیکد نوشتی ازت تشکر کنم.
راستی توی سیستم ما باید یه همچین ورودی رو از کاربر بگیریم، فعلا راه حلی که به ذهنم رسیده اینه که یک کنترل از textbox ارث ببرم، و در ابتدای ورودی این دو کاراکتر کنترلی رو بذارم، نظرت چیه؟ :-?
راستی این پنجره نظراتت کاراکتر کنترلی رو قبول نمیکنه، میخواستم نمونه کدم رو بذارم نشد. :-p
بسیار جالب بود. بسیار جالب بود. فوقالعاده بود. بسیار سپاسگزارم.
بسیاز عالی بود، استفاده کردم
“این یک جلمه به زیان فارسی است که کلمات English در آن باعث Break در جمله میشود”
وقتی این کاراکتر ها را وارد می کنیم، جمله به جلمه تبدیل می شود؟:دی
ممنون
Pingback: لینکهای مرتبط با صفحه کلید استاندارد فارسی، یونیکد و فارسی نویسی « دنیای پیرامون
با سلام
من توی ادیتوری مثل نوت پد امتحان کردم همه این کاراکترها رو نمیشناخت. میشه ادیتوری معرفی کنی که بشه همه این کاراکترها رو باهاش تست کردم. برای آموزش دادن لازم دارم.
با تشکر
متاسفانه در بعضی از محیط ها مانند VS2010 این موضوع کار نمیکند! فکر میکنم مشکل WPF باشد درست است؟
خطاب به a
این موضوع همه جا کار میکند، مشکل از کیبورد غیر استاندارد است
بله همینطور است.
روش رندر کردن متن در WPF تغییر نموده است.
و ایراداتی وجود دارد. بعضی از فونت ها به درستی نمایش داده نمیشوند و بعضی جاها کاراکتر های کنترلی مشابه windows form ها عمل نمی کنند.
کافی است امتحان کنید.
با سلام
این مشکل را در برنامه ورد چطور می شود حل کرد
که در اینترنت اگر متنی فارسی انتخاب کنیم و آن را به ورد انتقال دهیم از چپ به راست می گردد
بنده هر کاری میکنم مشکلم حل نمی شود
چاره چیست؟
Pingback: متون فارسی انگلیسی و مشکلات من « کامپایل مغزی
آیا در صفحهکلید پیشفرض لینوکس (مشخصا اوبونتو) هم امکان استفاده از ترکیب [+Alt وجود داره؟
Pingback: » چطور متون فارسی و لاتین مخلوط رو بدون به هم ریختگی بنویسم؟ صد اشکوب
Pingback: آشنایی با نویسههای ویژه یونیکد برای متون راست به چپ – افشار محبی
آقا خدا خیرت بده