۱۳۸۸/۰۹/۱۷

فقط به خاطر يك نيم فاصله!


نسخه‌ي 64 بيتي ويندوز 7 را نصب كرده‌ام و اولين مشكل، نبود صفحه كليد مطابق استاندارد 2901 براي نسخه‌هاي 64 بيتي ويندوز است. پروژه وب فارسي دانشگاه صنعتي شريف، سال‌ها قبل فقط يك نسخه‌ي 32 بيتي از آن را تهيه كرده و نسخه‌هاي 64 بيتي موجود، مطابق استاندارد 9147 هستند و من به دلايل ذيل حاضر به استفاده از آن نيستم!
  1. در استاندارد 9147 ، جاي ژ و پ مطابق صفحه كليدي كه در بازار ايران فروخته مي‌شود نيست (و بايد به همه پاسخگو باشيد كه چرا اينطوري است).
  2. ي و ك در آن اصلاح شده و ديگر عربي نيست كه چقدر هم خوب، اما من تعداد زيادي برنامه و همچنين تعداد قابل توجهي فايل word دارم كه مطابق استاندارد 2901 تهيه شده‌اند. مشكلات ي و ك فارسي و عربي را هم در اينجا ذكر كرده‌ام و به دنبال باگ‌هاي جديد در برنامه‌ها نمي‌گردم.
  3. با ي و ك فارسي اگر در گوگل جستجو كنيد تعداد پاسخ‌هاي مرتبط يافت شده بسيار بسيار كمتر از حالتي خواهد بود كه با ي و ك عربي جستجو كنيد.
  4. در يك سازمان بايد رويه‌ا‌ي واحد در اين مورد برقرار باشد. يا همه بايد از 2901 استفاده كنند و يا همه از 9147.

نسخه‌ي كامل استاندارد 9147 را از سايت آقاي اخگري مي‌توانيد دريافت نمائيد:

به همين دلايل خصوصا قسمت دوم (هر چند ممكن است با آن موافق نباشيد)، نياز به صفحه كليد مطابق استاندارد 2901 نسخه‌ي 64 بيتي داشتم.

براي تهيه صفحه كليد فارسي از برنامه Microsoft Keyboard Layout Creator استفاده مي‌شود كه نسخه‌ي 1.4 آن‌را از آدرس زير مي‌توانيد دريافت نمائيد. اين نسخه قابليت توليد فايل‌هاي dll مرتبط 64 بيتي را هم دارد:


يكي از قابليت‌هاي اين برنامه بارگذاري صفحه كليد فارسي جاري سيستم است:



صفحه كليد استاندارد 2901 پروژه وب فارسي را اگر با آن باز كرده و سپس از منوي Project‌ گزينه‌ي Build DLL and setup package را انتخاب نمائيد، با خطاي زير متوقف خواهيد شد:
ERROR: 'VK_SPACE' in Shift State 'Shift' must be made up of white space character(s), but is defined as '‌' (U+200c) instead.

كه دقيقا مربوطه به اين سطر در تعاريف صفحه كليد است (صفحه كليد را مي‌شود به صورت فايلي با پسوند klc هم save as كرد):


39 SPACE 0 0020 200c 0020 -1 // SPACE, ZERO WIDTH NON-JOINER, SPACE, <none>

مفاهيم اين ستون‌ها هم به شرح زير هستند:
0 //Column 4
1 //Column 5 : Shft
2 //Column 6 : Ctrl
3 //Column 7 : Shft Ctrl

يعني جهت نمايش نيم فاصله حاصل از تركيب shift space مطابق استاندارد تايپ ايران، بجاي 0x0020 يا همان فاصله، از 0x200C استفاده شده است (مطابق استاندارد تايپ ايران بايد نوشت "مي‌روم" و نه "مي روم". به نيم فاصله و فاصله دقت بفرمائيد).
اما اين برنامه‌ي محترم دقيقا همين مورد را غلط گرفته و فايل dll نهايي را توليد نمي‌كند (مطابق خطايي كه ذكر شد).
برنامه‌ي Microsoft Keyboard Layout Creator هم با دات نت فريم ورك نوشته شده است. اگر كمي با reflector به آناليز آن بپردازيم به كلاس Accept و متد زير خواهيم رسيد:
private bool VerifySpaceBarIntegrity(ShiftState ss, bool fMustBeDefined)
در اين متد جايي كه خطاي ذكر شده صادر مي‌شود، مربوط به چند سطر زير است:

if (!Utilities.IsSpacing(ss.Characters))
{
this.WriteErrorToLogFile("SpaceKeyNeedsWhiteSpaceCharacters", new string[] { "VK_" + Utilities.VkStringOfIvk(ss.VK), this.m_stStateLabel[ss.State], ss.Characters, Utilities.FromCharacterToUPlusForm(ss.Characters) });
flag = false; /*اينجا بايد اصلاح شود!*/
}
خوب! به نظر شما ايرادي دارد كه اين flag هميشه true باشد؟! براي همين منظور، فايل MSKLC.exe را پچ كرده‌ام كه از آدرس زير قابل دريافت است:

با استفاده از اين نسخه (ابتدا برنامه اصلي را نصب كرده و سپس فايل exe را جايگزين نمائيد)، به راحتي مي‌توان نسخه‌ي استاندارد و اصلي 2901 را بارگذاري و مجددا كامپايل كرد (بدون توقف كامپايل به خاطر فقط يك نيم فاصله‌ي غيرمعتبر از ديدگاه نويسندگان اصلي برنامه). به اين صورت فايل‌هاي 64 بيتي لازم هم توليد مي‌شوند كه حاصل نهايي را از آدرس زير مي‌توانيد دريافت نمائيد:



اين فايل‌ها دقيقا بر مبناي همان فايل‌هاي پروژه وب فارسي استاندارد 2901 هستند؛ با اين تفاوت كه نسخه‌‌هاي غير 32 بيتي هم در آن لحاظ شده‌اند.


نصب اين dll ها هم از ويندوز ويستا به بعد داستان خودش را پيدا كرده؛ ابتدا بايد take ownership شود، سپس مي‌توان فايل اصلي را به سادگي جايگزين كرد و سپس reboot .
براي اين منظور ابتدا به پوشه‌ي system32 ويندوز مراجعه كرده و فايل KBDFA.DLL را پيدا كنيد.
در ادامه به پنجره خواص آن (كليك راست و انتخاب properties) مراجعه و برگه‌ي Security آن‌را انتخاب كنيد.
در اين قسمت بر روي دكمه‌ي Advanced كليك نمائيد.
در صفحه‌ي باز شده به برگه‌ي Owner مراجعه كنيد.
در اين قسمت بر روي دكمه‌ي Edit كليك نموده و كاربر خودتان را اضافه نمائيد.
پس از طي اين مرحله (يا همان take ownership) به برگه security مراجعه كرده و به كاربر خودتان دسترسي full control بدهيد.
اكنون مجوز تغيير اين فايل را بدون هيچ مشكلي خواهيد يافت.
در پايان reboot را فراموش نكنيد.

راه دوم:
يا برنامه نصاب حاصل از برنامه‌ي Microsoft Keyboard Layout Creator، مدخل جديدي را به صفحه كليدهاي قابل انتخاب ويندوز در كنترل پنل اضافه مي‌كند كه نيازي به reboot ندارد.