افراد مختلف راه حلهای مختلفی را برای غلبه بر این مشکل پیدا کردهند. بعضیها یک MaskEdit برای ورود شماره در نظر گرفتهاند. بعضیها شماره نامه وارده شده را به صورت یک عکس render کرده و نمایش میدهند. بعضیها برای نمایش صحیح در صفحات وب یک ActiveX ایجاد کردهاند. بعضیها هم قالب شماره نامه را طوری تعریف کردهاند که دچار مشکل کمتری شوند و این قالب را به کارفرما تحمیل کردهاند.
اما راه حلی که من مورد استفاده قرار دادهام استفاده از نویسه یونیکد LEFT-TO-RIGHT OVERRIDE است. وجود این نویسه در هر رشتهای باعث میشود کلیه نویسههایی که بعد از آن وارد میشوند به صورت اکیداً چپ به راست نمایش نمایش یابند. یعنی انگار نه انگار محیط کار، راست به چپ است. به عنوان مثل فرض کنید میخواهیم جمله «پاییز زیبا است» را یک بار به صورت عادی و یک بار دیگر هم با وارد کردن این کاراکتر بین کلمات «پاییز» و «زیبا» نمایش دهیم. عکس زیر هر دو حالت را نمایش میدهد.
حال روش من برای استفاده از این کاراکتر این است که در رویداد OnKeyPress (یا هر رویداد مشابه دیگری) بعد از ورود هر کاراکتر توسط کاربر، این کاراکتر نیز به قبل از آن اضافه شده سپس نمایش یابد. نهایتاً به هنگام ذخیره متن وارد شده بایستی به جز کاراکتر ابتدای متن، بقیه کاراکترهای LEFT-TO-RIGHT OVERRIDE را از متن پاک کرد. چون وجود بیش از یک مورد آن غیر ضروری است. برای درک بهتر موضوع به کد جاوا اسکریپت زیر که این روش را در صفحات وب پیاده سازی میکند دقت کنید. بدیهی است که برای WinForm و WPF هم میتوان این روش را به کار برد:
{
//از این تابع در onkeypress هر textBox که استفاده شود باعث میشود که
//کاراکترهای تایپ شده توسط کاربر به طور مطلق از چپ به راست نمایش داده
//شود. حتی اگر کاربر یک متن فارسی را وارد کند. کاربرد فعلی این تابع
//در شماره نامه است که همیشه از چپ به راست خوانده میشود
//دقت شود که رشته تولید شده توسط این تابع پر از کاراکتر یونیکد 0x202d است و
//قبل از ذخیره در بانک اطلاعاتی یا انجام هر پردازش دیگری باید از رشته مورد نظر پاک شود
var key;
var obj;
if (window.event) {
e = window.event;
obj = e.srcElement;
key = e.keyCode;
} else {
obj = e.target;
key = e.charCode;
}
//0x202d: LEFT-TO-RIGHT OVERRIDE
obj.value = String.fromCharCode(0x202d)+obj.value;
return true;
}
پ. ن. ۱: کاراکتر LEFT-TO-RIGHT OVERRIDE یکی از کاراکترهای ویژه معرفی شده در الگوریتم شماره ۹ یونیکد (الگوریتم دو جهته) و جزیی از استاندارد ماتصا ۶۲۱۹ (ISIRI 6219) میباشد.
پ. ن. ۲: برای مطالعه بیشتر اینجا و اینجا را بخوانید.
پ. ن. ۳: استفاده از ابزارک «فردیس» شاید بتواند در کار با نویسههای ویژه یونیکد کمک کند.
پ. ن. ۴: من ایده اصلی این کار را از این کتابخانه که برای شبیه سازی صفحه کلید ۲۹۰۱ در محیطهای غیر فارسی نوشته شده بود و با نگاهی به اینجا و اینجا گرفتم.
Comments
جالب بود.
واقعا عالی و مفید بود.
تست