سندرم شماره نامه به هم ریخته

همه کسانی که در نوشتن نرم‌افزارهای دبیرخانه دخیل بوده‌اند با مشکلی به اسم به هم ریختگی شماره نامه آشنا هستند. شماره نامه معمولاً ترکیبی از اعداد، علائم، حروف فارسی و گاهاً انگلیسی هستند. از آنجا که ما در یک محیط دو جهته زندگی می‌کنیم هنوز در نحوه چینش صحیح این حروف در کنار یکدیگر ابهاماتی وجود دارد و مردم بسیاری از قواعد موجود را هم یا نمی‌شناسند یا اصلاً به کار نمی‌برند. در نتیجه چیزی که کاربر با هزار دردسر به عنوان شماره نامه وارد می‌کند به هنگام نمایش مجدد دچار به هم ریختگی می‌شود. مثلاً جای حروف و علائم عوض شده یا علامتی مثل خط تیره به جای آن که در سمت راست یک کاراکتر نمایش یابد به سمت چپ آن منتقل می‌شود. این قضیه وقتی تشدید می‌شود که شماره نامه ذخیره شده را بخواهیم در محیط‌های متنوعی مثل reportها، برنامه‌های ویندوزی، وب (IE و فایرفاکس)، xmlهای مربوط به پروتکل ECE و محیط‌های خام مثل SQL Server Management Studio نمایش دهیم. به عنوان نمونه به تصاویر زیر که یک شماره نامه واحد را آن طور که در محیط‌های مختلف دیده می‌شود دقت کنید:

افراد مختلف راه حل‌های مختلفی را برای غلبه بر این مشکل پیدا کرده‌ند. بعضی‌ها یک MaskEdit برای ورود شماره در نظر گرفته‌اند. بعضی‌ها شماره نامه وارده شده را به صورت یک عکس render کرده و نمایش می‌دهند. بعضی‌ها برای نمایش صحیح در صفحات وب یک ActiveX ایجاد کرده‌اند. بعضی‌ها هم قالب شماره نامه را طوری تعریف کرده‌اند که دچار مشکل کمتری شوند و این قالب را به کارفرما تحمیل کرده‌اند.


اما راه حلی که من مورد استفاده قرار داده‌ام استفاده از نویسه یونیکد LEFT-TO-RIGHT OVERRIDE است. وجود این نویسه در هر رشته‌ای باعث می‌شود کلیه نویسه‌هایی که بعد از آن وارد می‌شوند به صورت اکیداً چپ به راست نمایش نمایش یابند. یعنی انگار نه انگار محیط کار، راست به چپ است. به عنوان مثل فرض کنید می‌خواهیم جمله «پاییز زیبا است» را یک بار به صورت عادی و یک بار دیگر هم با وارد کردن این کاراکتر بین کلمات «پاییز» و «زیبا» نمایش دهیم. عکس زیر هر دو حالت را نمایش می‌دهد.

حال روش من برای استفاده از این کاراکتر این است که در رویداد OnKeyPress (یا هر رویداد مشابه دیگری) بعد از ورود هر کاراکتر توسط کاربر، این کاراکتر نیز به قبل از آن اضافه شده سپس نمایش یابد. نهایتاً به هنگام ذخیره متن وارد شده بایستی به جز کاراکتر ابتدای متن، بقیه کاراکترهای LEFT-TO-RIGHT OVERRIDE را از متن پاک کرد. چون وجود بیش از یک مورد آن غیر ضروری است. برای درک بهتر موضوع به کد جاوا اسکریپت زیر که این روش را در صفحات وب پیاده سازی می‌کند دقت کنید. بدیهی است که برای WinForm و WPF هم می‌توان این روش را به کار برد:

function ltr_override(e)
{
//‫از این تابع در 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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *