فقط به خاطر یک نیم فاصله!
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: پنج دقیقه

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

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

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

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


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



صفحه کلید استاندارد 2091 پروژه وب فارسی را اگر با آن باز کرده و سپس از منوی 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 را پچ کرده‌ام که از آدرس زیر قابل دریافت است:

  دریافت پچ شده نگارش 1.4.6000.2 : MSKLC.Patched.7z  

با استفاده از این نسخه (ابتدا برنامه اصلی را نصب کرده و سپس فایل exe را جایگزین نمائید)، به راحتی می‌توان نسخه‌ی استاندارد و اصلی 2091 را بارگذاری و مجددا کامپایل کرد (بدون توقف کامپایل به خاطر فقط یک نیم فاصله‌ی غیرمعتبر از دیدگاه نویسندگان اصلی برنامه). به این صورت فایل‌های 64 بیتی لازم هم تولید می‌شوند ( ممکن است در حین کار با برنامه‌ی patch شده، نمایش خطای کار با نیم فاصله را مجددا دریافت کنید؛ اما مهم نیست . نمونه‌ی وصله شده، بدون مشکل حاصل را کامپایل می‌کند که در نمونه‌ی اصلی اینطور نیست. یعنی پس از overwrite کردن فایل exe موجود، با نمونه patch شده، برنامه کار کامپایل را کامل می‌کند) که حاصل نهایی را از آدرس زیر می‌توانید دریافت نمائید:


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

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

راه دوم:
یا برنامه نصاب حاصل از برنامه‌ی Microsoft Keyboard Layout Creator، مدخل جدیدی را به صفحه کلیدهای قابل انتخاب ویندوز در کنترل پنل اضافه می‌کند که نیازی به reboot ندارد.
  • #
    ‫۱۴ سال و ۱۰ ماه قبل، سه‌شنبه ۱۷ آذر ۱۳۸۸، ساعت ۲۱:۱۶
    سلام استاد . راستی مهندس جان این فایل Kbdfa-2091-x86-x64 رو بگیرم وبا روشی که در انتهای آموزش توضیح دادی انجام بدم ؟ من هم 7 64 بیتی دارم.
  • #
    ‫۱۴ سال و ۱۰ ماه قبل، سه‌شنبه ۱۷ آذر ۱۳۸۸، ساعت ۲۲:۱۰
    سلام
    اگر با استاندارد 2091 می‌خواهید کار کنید، بله.
    در غیر اینصورت (نیاز به استفاده از استاندارد 9147)، فایل‌های آقای اخگری را دریافت کنید که نسخه‌ی 64 بیتی هم دارد و بدون مشکل با ویندوز 7 64 بیتی کار می‌کند.
  • #
    ‫۱۴ سال و ۱۰ ماه قبل، چهارشنبه ۱۸ آذر ۱۳۸۸، ساعت ۰۱:۰۰
    سلام،

    راه حلی که من برای دور زدن این اشکال MKLC پیدا کرده بودم این بود که یک برنامه کوچک که خط فرمان را در جایی ذخیره می‌کرد نوشتم و آن را جایگزین فایل‌های cl.exe و link.exe که به همراه MKLC می‌آیند کردم.

    MKLC به این روش کار می‌کند که از تعریف صفحه کلید یک فایل کد C ایجاد می‌کند و آن را توسط نسخه‌ای از Visual C که به همراه خود برنامه هست کامپایل می‌کند.

    من به این روش فایل C تولید شده را ویرایش می‌کردم و ترکیب Shift+Space را در آن اصلاح می‌کردم و با خط فرمانی که به کمک برنامه ذکر شده به دست می‌آوردم صفحه کلید را کامپایل می‌کردم.

    ولی راه حل شما هم خیلی جالبه و فکر می‌کنم که برای نسخه‌های بعدی من هم از آن استفاده کنم.
  • #
    ‫۱۴ سال و ۱۰ ماه قبل، چهارشنبه ۱۸ آذر ۱۳۸۸، ساعت ۱۴:۱۷
    استاندارد ۲۰۹۱ اشتباه است. حتما منظورتان استاندارد ۲۹۰۱ بوده است.
  • #
    ‫۱۴ سال و ۱۰ ماه قبل، چهارشنبه ۱۸ آذر ۱۳۸۸، ساعت ۱۴:۲۶
    بله. لینک به همان صفحه است (http://www.isiri.org/std/2901.htm). ممنون.
  • #
    ‫۱۴ سال و ۱۰ ماه قبل، چهارشنبه ۱۸ آذر ۱۳۸۸، ساعت ۱۸:۲۸
    با اینکه معمولا از نوشته های شما استفاده می کنم اما عموما با نظر شما در استفاده از استانداردها مخالفم.
    اینکه ما استاندارد منقرض شده ۲۹۰۱ و از آن بدتر ترکیب ی و ک عربی را استفاده کنیم نه بجاست و نه ارزشی دارد.
    اصولا همین محتوایی هم که وجود دارد اشتباه است و این همه اشتباه را نباید ادامه داد. اینکه هیچ کیبورد فارسی کلمه پ و ژ را مطاق استاندارد ندارد دلیلی بر عدم استفاده نیست. خود من روی لپ تاپم هیچ حرف فارسی نوشته نشده و براحتی ا آن کار می کنم و به هیچ کسی هم جواب نمیدهم که چرا جای حروف به فلان شکل است.
    در ضمن جهت اطلاع عرض کنم که جای پ و ژ در استاندارد ۲۹۰۱ هم دقیقا همین جایی بود که در ۹۱۴۷ هست و این دو کلید که شما ذکر کردید جای دیگری ندارد.
    تا آنجا هم که من اطلاع دارم در اولین سرویس پک ویندوز ۷ قالب استاندارد ۹۱۴۷ جانشین قالب کیبورد فارسی غیر استاندارد ویندوز می شود و خود بخود یک بخش عظیمی از مشکلات حل می شود.
    از شما هم خواهش می کنم که کلمه ۲۰۹۱ را با ۲۹۰۱ عوض کنید که خوانندگانی که اطلاع کافی راندارند و به خودشان هم برای مطالعه زحمت نمی دهند در آینده دچار مشکل نشوند.
    در ضمن امیدوارم بزودی شاهد ستفاده شما از استاندارد ۹۱۴۷ باشیم و کیبوردی هم برایآن تولید شود
  • #
    ‫۱۴ سال و ۱۰ ماه قبل، چهارشنبه ۱۸ آذر ۱۳۸۸، ساعت ۱۹:۴۴
    "اینکه هیچ کیبورد فارسی کلمه پ و ژ را مطاق استاندارد ندارد دلیلی بر عدم استفاده نیست."

    اصولا استاندارد باید برگرفته از صنعت کشور باشد نه تحمیل بی منطق به آن.
  • #
    ‫۱۴ سال و ۱۰ ماه قبل، پنجشنبه ۱۹ آذر ۱۳۸۸، ساعت ۱۳:۵۵
    از اصلاح استاندارد ۲۹۰۱ سپاسگذارم و در ارتباط با
    «اصولا استاندارد باید برگرفته از صنعت کشور باشد نه تحمیل بی منطق به آن.»

    باید عرض کنم که با این مطلب موافقم اما دقت کنید که در استاندارد ۹۱۴۷ مزایای بسیاری هست که از آن جمله می توان به داشتن کاراکترهای RLE- lRE - RLO - LRO - و چند کاراکتر بدربخور دیگر و همچنین سایر کاراکترهای مورد نیاز در فارسی برای مثال حروف «» که باید در فارسی بجای () استفاده شوند نیز هست
    گرچه خودمن در ۹۵ درصدر موارداز همین () استفاده می کنم و حتی اینکه سایر کیبورد ها هم در بعضی موارد این کلیدهای «» را در بردارند اما در نظر داشته باشید که گرداوری این کلیدها و چینش آن در کنار هم امر بسیار مهمی است.
    من هم امیدوارم که در آینده صنعت کشور از تولید کیبوردهای غیراستاندارد دست برداشته و با فشار موسسه استاندارد از صفحه کلید جدید استفاده کند
    خود من خیلی به تعویض این رویه با تعویض قالب استاندارد در خود ویندوز امیدوار هستم و سعی می کنم برای استفاده از این قالب کیبورد به همه گوشزدهای کافی را بکنم و شاید با این کار استفاده از فونت های غیراستاندارد و غیر یونیکد بخصوص فونتهای سری‫ B منسوخ شود
  • #
    ‫۱۴ سال و ۱۰ ماه قبل، شنبه ۲۱ آذر ۱۳۸۸، ساعت ۲۰:۱۷
    سلام

    ایده جالب و مفیدی بود. (پچ کردن) متشکرم.

    پیشنهاد میکنم برای نامگذاری پستهایتان از این روش استفاده کنید، جستجوی آنها (SEO) ساده‌تر میشود:
    http://mohammadshams.blogspot.com/2009/11/keywords-in-blogger-posts-url.html
  • #
    ‫۱۴ سال و ۱۰ ماه قبل، پنجشنبه ۳ دی ۱۳۸۸، ساعت ۱۵:۰۲
    بسیار ممنون، پست خوب و دقیقی بود و من رو (بعد از مدت ها عادت کردن به چیدمان کیبورد استاندارد 9147 در مک و لینوکس) از شر این کیبورد به هم ریخته مایکروسافتی نجات خواهد داد؛ گر چه من ترجیح می دهم از همان 9147 استفاده کنم اما نوشته خوب و دقیقی بود.
  • #
    ‫۱۴ سال و ۶ ماه قبل، چهارشنبه ۸ اردیبهشت ۱۳۸۹، ساعت ۲۲:۲۲
    سلام. فایل پچ شده از سایت هات فایل پاک شده. ممکن است دوباره آن را آپلود کنید؟ با تشکر
  • #
    ‫۱۴ سال و ۶ ماه قبل، چهارشنبه ۸ اردیبهشت ۱۳۸۹، ساعت ۲۳:۴۹
    ابتدا برنامه اصلی باید نصب شود و سپس ...
    http://www.box.net/shared/3fb788r5hh
  • #
    ‫۱۳ سال و ۱۰ ماه قبل، پنجشنبه ۲ دی ۱۳۸۹، ساعت ۲۲:۵۳
    نصاب مخصوص استاندارد 2901 : (+)
  • #
    ‫۱۳ سال و ۱۰ ماه قبل، چهارشنبه ۸ دی ۱۳۸۹، ساعت ۱۳:۲۵
    در این پست
    https://www.dntips.ir/2010/12/nhibernate.html
    خدمتتان عرض کردم که مشکل تنها با تعویض Localeحل شد.
    2 نکته را خدمت دوستان عرض کنم
    1- روشی که من استفاده کردم بدون نصب صفحه کلید و فقط به امید تشخیص درست ویندوز بود. اما پس از اینکه ویندوز 7 را بدلایلی تعمیر کردم در System32 فایل اصلی Persian را از شاخه
    \Windows\winsxs\x86_microsoft-windows-i..l-keyboard-00000429_31bf3856ad364e35_6.1.7600.16385_none_eaa4864ec343a675
    بارگذاری کرد و باز ک و ی فارسی داشتم .

    2- با استفاده از روش مندرج در همین تاپیک و نرم افزاری که شما تهیه کردید توانستم باز صفحه کلید عربی را سرجایش بنشانم و اینبار این صفحه کلید تعریف شد.

    باز هم از مطلب مفیدتان تشکر میکنم
  • #
    ‫۱۲ سال و ۴ ماه قبل، دوشنبه ۲۹ خرداد ۱۳۹۱، ساعت ۱۶:۳۷
    سلام
    ممکن هست لینک دانلود برنامه پچ شده را قرار دهید
    یکی فیلتر هست و دیگری ظاهرا پاک شده با تشکر

  • #
    ‫۹ سال و ۴ ماه قبل، جمعه ۸ خرداد ۱۳۹۴، ساعت ۲۱:۵۴
    یک نکته‌ی تکمیلی
    آخرین نگارش ISIRI 9147 را از اینجا می‌توانید دریافت کنید.
    • #
      ‫۹ سال و ۴ ماه قبل، شنبه ۹ خرداد ۱۳۹۴، ساعت ۰۶:۱۵
      امکان اتصال به آن با IP ایرانی نیست.