بررسی تاریخچهی مشکل ی و ک و ارایه راهکارها
فروردین ۵م, ۱۳۸۶من زمانیکه توی فرا مدیر پروژهی bekhan.com و fara.ir شدم و وقتی persianwizard رو درست کردم و بعدش که توی بانک مدیر R& D شدم، همیشه اولین چیزی که بهش فکر میکردم چارهاندیشی به روشها مختلفی برای حل مسالهی ی و ک بود. یه کدهایی هم درست کردم و دارمشون یکسریهاش هم ندارم و از دست دادمشون ولی توی ذهنم همشون هست من یقین میدونم که اگه روشهایی رو که آخر این نوشته آمده به کار ببریم تاثیر بسیار زیادی روی حل این مشکل خواهیم داشت. مانی منجمی هم که توی فارسیسازی رودپرس بسیار کوشا و فعال هست یک نظرخواهی مطرح کرده که بهانهی این نوشته شد
برای شروع مجبور هستم که یک پیشگفتاری رو برای آشنایی بگم – اگر داستان ی و ک عربی و فارسی رو میدونید و راه حلها رو میخواهید ببینید این بخش رو نخونید و برید به پایین صفحه-؛
به ستون الف و ۱۲ واژهی زیرش نگاه کنید؛
|
|
ستون الف |
ستون ب |
| ۱ | کارآفرینی | ک ارآفری نی |
| ۲ | کارآفریني | ک ارآفری ني |
| ۳ | کارآفرينی | ک ارآفري نی |
| ۴ | کارآفريني | ک ارآفري ني |
| ۵ | كارآفرینی | ك ارآفری نی |
| ۶ | كارآفریني | ك ارآفری ني |
| ۷ | كارآفريني | ك ارآفري ني |
| ۸ | كارآفريني | ك ارآفري ني |
| ۹ | کمک | ک مک |
| ۱۰ | کمك | ک مك |
| ۱۱ | كمک | ك مک |
| ۱۲ | كمك | ك مك |
باور میکنید که این ۱۲ واژه برای یک جستجوگر، ۱۲ عبارت کاملا متفاوت باشد؟ دقیقتر بگویم یعنی اینکه اگر شما یا دیگری نوشتهای نوشته باشید که در آن برای نمونه واژهی « كارآفريني» به کار رفته باشد و بخواهید با موتور جستوجویی آن را با جستوجوی واژهی « کارآفرینی» بیابید. هرگز موفق نمیشوید و موتور جستوجوگر چیزی به عنوان نتیجه به شما نشان نمیدهد. همچنین اگر نوشته باشید « كمك» و « کمک» را جستوجو کنید
شاید اگر کمی دقت کنید بتوانید تفاوت ظاهری بین شمارههای ۱، ۳، ۵ (گروه یک) و ۲، ۴، ۶، ۷، ۸ (گروه دو) بشوید. بله شکل حرف «ی» آخرِ تنها در گروه یک و گروه دو فرق دارد، در گروه یک «ی» و در گروه دو «ي» است. اما نمیتوانید با چشم تفاوت دیگری در این ۸ واژه ببینید در صورتیکه هیچکدامشان شبیه به هم نیستند تا زمانیکه به «ستون ب» نگاه کنید؛ میبینید شکل «ک» و «ی» هم در اول و وسط واژهها با یکدیگر فرق دارد و این تفاوت تا زمانیکه «ی» و «ک» به صورت تنها در آخر واژهها نباشند دیده نمیشود
اگر به شمارههای ۹، ۱۰، ۱۱، ۱۲ هم نگاهی بیندازید، در نگاه اول تنها تفاوت ۹، ۱۱ (گروه سه) را با ۱۰، ۱۲ (گروه چهار) میتوانید تشخیص دهید و تنها زمانیکه به «ستون ب» نگاه کنید میفهمید که دو جور «ک» و «ك» در اول واژهی کمک به کار رفته است.
موضوع چیست؟
موضوع این است ما از ترکیب ۴ نوع حرف متفاوت «ی»، «ي»، «ک» و «ك» برای نوشتن واژههای «کارآفرینی» و «کمک» استفاده کردهایم.
اجازه بدهید تا آخر این نوشته، واژهی «نویسه» که برگردان واژهی انگلیسی « character » است را به جای واژهی «حرف» به کار ببرم.
خوب اگر کمی هم ریاضی بدانیم؛ میتوانیم محاسبه کنیم که به چند حالت میتوان واژهی «کمک» را با نویسههای ک، ك، م بدون تکرارنوشت؟
پاسخ: خوب جای نویسهی اول میشود ۲ تا نویسهی ک و ك را به کار برد و در جای نویسهی آخر هم ۲ تا
بنابراین ۲×۲=۴ پس به ۴ گونه میتوان واژهی کمک را نوشت که در جدول بالا هم آمده است.
با همین روش میتوان حساب کرد که به ۸ گونه میتوان واژهی کارآفرینی را نوشت؛
|
نویسه |
ک |
ا |
ر |
آ |
ف |
ر |
ی |
ن |
ی |
پاسخ |
|
ضرب جایگشتها |
۲ |
۱ |
۱ |
۱ |
۱ |
۱ |
۲ |
۱ |
۲ |
۸ |
کمی وحشتناک است! اما چرا این دو نویسه دو به دو با هم شبیهند؟ و کدام را باید به کار برد؟ چه شده است که ما برای یک حرف دو نویسهی متفاوت داریم؟ چرا «ي» دو نقطه زیرش دارد و «ك» همزه دارد و سرکش هم ندارد؟
چون نویسههای ي و ك فارسی نیستند و عربی هستند و در خطهای عربی باید به کار برده شوند. بنابراین روشن است که باید شبیه حروف عربی باشند که هستند
اما این دو نویسه بنابر جایگاهی که در یک واژه پیدا میکنند - اول وسط و آخر- شکلهای متفاوتی را به خود میگیرند به جدول زیر نگاه کنید؛
|
نویسه/جایگاه |
اول |
وسط |
چسبان آخر |
تنها |
|
ي |
يک |
آفرين |
آفریني |
آشناي |
|
ك |
كم |
نمكار |
كمك |
درك |
|
|
|
|
|
|
|
ی |
یک |
آفرین |
آفرینی |
آشنای |
|
ک |
کم |
نمکار |
کمک |
درک |
همانگونه که میبینید نویسهی عربی «ي» در دو جایگاه اول و وسط کاملا مانند شکل نویسهی «ی» در همان جایگاه است و نویسهی عربی «ك» در سه جایگاه اولع وسط و چسبانِ آخر مانند نویسهی فارسی «ک» در همان جایگاه است.
به همین دلیل است که واژههایی که با نویسهی «ي» عربی و نویسهی «ك» عربی نوشته شده باشند در جایگاههای گفته شده از نظر ظاهری شبیه به نویسههای «ی» و «ک» فارسی بوده و قابل تشخیص نیستند.
اما یک برنامهی کامپیوتری این تفاوت را میفهمد چرا که همانگونه که احتمالا میدانید در کامپیوتر همه چیز به صورت اعداد ۰ و ۱ تبدیل میشوند تا برای آن قابل فهم باشد. بنابراین شکل ظاهری یکسان یک نویسه ابدا اثری در شناسایی آن برای کامپیوتر ندارد، از آنجا که هر نویسه در استاندارد یونیکد، کد (شمارهی) یکتایی دارد و با ان شماره است که به کامپیوتر یا یک برنامهی نرمافزاری شناسانده میشود، این تفاوت برای موتورهای جستوجو به آسانی قابل تشخیص است به جدول زیر نگاه کنید؛
| نویسه | یونیکد | کدهگزا |
| ی | ۰۶CC | ۱۷۴۰ |
| ک | ۰۶A۹ | ۱۷۰۵ |
| ي | ۰۶۴A | ۱۶۱۰ |
| ك | ۰۶۴۳ | ۱۶۰۳ |
این جدول به روشنی نشان میدهد که برای یک برنامهی نرمافزاری این ۴ نویسه مانند ۴ نویسه (حرف) کاملا متفاوت است و روشن است که واژههایی هم که از ترکیب این ۴ نویسه بوجود آیند اگرچه برای انسان (ما ها) در ظاهر تفاوتی ندارد اما برای کامپیوتر و نرمافزارها متفاوت است.
و به همین دلیل است که برای نمونه هنگام جستوجوی «کمک» تنها واژههایی که در آنها نویسهی فارسی«ک» وجود دارد به عنوان نتیجهی جستجو نمایش مییابند و اگر واژههایی مانند «كمك» در متن مورد جستوجو باشند نمایش داده نمیشوند چون موتور جستوجو این دو واژه را یکی نمیداند که درست هم هست!
اما چه شده است که این دو نویسه در تخته (صفحه) کلید فارسی آمده است؟
سیستم عاملهای ویندوز۹۸ اساسا برای زبان فارسی درست نشده بودند، شرکتهایی مانند برنا رایانه و … با ایجاد تغییرات کوچکی روی ویندوزهایی که هستهی آنها عربی بود وبندوزهایی را ارایه دادند که قابلیت نوشتن به زبان فارسی را دارا بود. آنها نویسههای پ، ژ، گ و چ را به صفحه کلید فارسی افزودند اما حساسیتی بر روی ی و ک فارسی نشان ندادندو احتمالا در نظر نگرفتند که ي و ك، عربی هستند و نیاز به افزودن ی و ک فارسی همچون «گچ پژ» وجود دارد. پس از مدتی آنها برای پوشاندن اشتباه خود دست به اشتباه بزرگتری زدند و فونتهایی را طراحی کردند که اگر از آنها در نوشتن ي و ك استفاده میشد ظاهر فونت را به شکل ی و ک نشان میداد! در صورتیکه کد نویسه همچنان متفاوت بود.
این اشتباه از سوی کسی جدی گرفته نمیشد تا زمانی که ویندوز ۲۰۰۰ به بازار آمد و در آن صفحه کلید فارسی اینبار از سوی سرکت مایکروسافت و نه شرکتهای داخلی گنجانده شده بود و جای ي و ك عربی با ی و ک فارسی عوض شده بود. این رخداد بسیار مهم و خوب بود تنها یک اشتباه فاحش از سوی مایکروسافت اتفاق افتاده بود؛ فونتهایی که یونیکد بود و فارسی را پشتیبانی میکرد مانند Tahoma یا Times new roman و …برای نویسهی «ی» فارسی از ۴ حالتی که در جدول بالا بررسی شد و باید میداشت تنها یک حالت داشت . آن هم «ی» تنهایِ آخر بود.
این مشکل باعث میشد که نتوان از ی فارسی در بیشتر واژهها استفاده کرد چرا که عملا خوانایی متن را بسیار دشوار میکرد. اما ک فارسی چنین مشکلی را نداشت. بنابراین بسیاری تصمیم گرفتند که از ک فارسی استفاده کنند اما از ي عربی به جای ی فارسی استفاده کنند در حقیقت دونقطهی زیر ي عربی را به نمایش ی فارسی تنهای آخر ترجیح دادند. برخی هم برای ی وسط از ي عربی استفاده میکردند اما برای آنکه دو نقطهی ي عربی در حالت تنها نمایش نیابد از ی فارسی استفاده میکردند! مانند: کارآفري ن ی
اگر چه پس از آن فونتها اصلاح شد و دلیلی برای استفاده از ي عربی نبود اما به دلیل زیاد بودن محتوی فارسی تولید شده مخصوصا در وب تا آن زمان بسیاری برای جستوجوی واژهها از ي عربی استفاده میکردند و نتایج جستوجو بهتر بود.
با توضیحاتی که دادم و دو مثال بالا عمق دشواری جستوجوی یک واژه را که در آن هم ی و ک باشد خواهید فهمید!
قلم و صفحهکلید استاندارد را هم برای اطلاعات بیشتر ببینید.
اما اکنون زمان تغییر است، باید شیوههایی را طراحی و توصیه کرد تا تولید محتوای ناخواسته با نویسههای ي و ك به کمترین حد خود برسد. و از طرفی واکشی دادهها در هنگام جستوجو نیز نتایج بهتری را ارایه دهد.
روشها:
باید به این مراحل فکر کرد:
- زمانی که متنی نوشته میشود
- زمانی که متن فرستاده میشود
- زمانی که متن ذخیره میشود
- زمانی که متن واکشی شده و نمایش پیدا میکند
۱) در این مرحله دو حالت
- همان فرم شروع به نوشتن کند
- از ویرایشگری خارجی برای نوشتن استفاده کند مانند Word و … و سپس متن نوشته شده را در فرم وبی کپی کند
برای حالت اول راه حل ساده است؛ میتوان با قرار دادن یک جاوااسکریپت، صفحه کلید فارسی برای فرم گذاشت که در چیدمانش اولا ی و ک در جای درست خود هستند و ثانیا هر ي و ك که تایپ شود در جا به ی و ک تبدیل شود
برای حالت دوم هیچکاری با روش جایزگینی درجا (Real-Time Replacing) نمیشه انجام داد. چون وقتی شما متن رو از جایی کپی کنید Client نمیتونه پردازشی داشته باشه
نتیجه ۱: این روش جامع و مانع نیست و نمیتونه روشی برای رفع مشکل ی و ک باشه با توضیحاتی که دادم اما ایدهی گذاشتن یک کیبورد فارسی که مستقل از سیستم عامل بشه فارسی تایپ کرد ایدهی خیلی خوبیه که اولین بار در گروه فارسیوب شریف و بعد در پرشینبلاگ استفاده شد. بنابراین پیشنهاد میشه این ادیتور فارسی باشه ولی بدونیم که برای رفع مشکل ی و ک نیست و از اونجاییکه ممکنه کسی بخواهد از «ي» و «ك» هم استفاده کنه جایگزینی اتفاق نیفته و فقط چیدمان استاندارد رعایت شده باشه. (من این روش رو توی سایت خودم به کار بردم)
۲) زمانی که متن فرستاده میشود، یعنی قبل از اینکه توی پایگاه داده (database) ذخیره بشه در این مرحله میشه پیش از اینکه چیزی توی دیتابیس ذخیره بشه ی و ک رو با یک تابع (Function) درست کرد و بعد ذخیره انجام بشه. تنها مشکلی که این روش داره اینه که باید حتما replace کردن به عنوان گزینه برای کاربر قابل انتخاب باشه چون که در برخی مواقع کاربر میخواهد که از نویسهی «ي» و «ك» آگاهانه استفاده کنه مثل همین نوشته و ابنابراین همهی متنها بدون گزینش کاربر هنگام ذخیره شدن نباید جایگزین شوند.
نتیجهی ۲: پیشنهاد میشود که به صورت پیشفرض برای هر نوشته این قابلیت فعال باشد ولی امکان انتخاب برای کاربر وجود داشته باشد (این روش رو هم توی بانک کارآفرین به کار بردم)
۳) زمانی که متن ذخیره شده است:
پس از اینکه نوشتهها ذخیره شد با تابعی کل دیتابیس Seek شده و جایگزینی صورت بگیرد
این روش به عنوان یک راه حل کلی منسوخ شده تقریبا ولی یه جاهایی کاربرد داره هنوز و خوبه که این تابع هم وجود داشته باشه. حالا بگم کجا کاربرد داره: فرض کنید که شما ۶ ساله دارید مینویسید و کلی مطلب وجود داره که ی و ک اون عربی نوشته شده با روشهای گفته شده در بالا باید هر نوشتهای رو مستقل باز کرد و ویرایش کرد که کاری است بی دشوار و کاربرپسند (User-friendly) هم نیست. این تابع یه همچین جاهایی کاربرد داره که معمولا هر از چندگاهی مورد استفاده قرار میگیره فقط قبل از اینکه جایگزین کنه باید همهی پستهایی رو که داره جایگزینی توش انجام میشه توی یک فهرست بیاره که Confirm بشه توسط کاربر و البته پیشفرضش باید چک مارک خورده باشند همه (این رو توی بخوان.کام انجام دادیم)
۴) زمانی که متن واکشی میشود: منظور همون جستوجو هست بیشتر با فرض اینکه همهی کارهای بالا انجام شده باشه با اینحال شدیدا پیشنهاد میکنم که تابعی نوشته بشه برای جستوجو که ی و ي – و ک و ك دو بدو با هم Or بشوند و همهی نتایج نشان داده بشه که کاملا مستقل از اینکه کاربر چی تایپ میکنه هوشمندانه جستوجو انجام بشه به صورت پیشفرض و گزینه بده باز به کاربر که با تیک بتونه نا فعال کنه اون رو (من این روش رو برای گوگل اون موقع که بتا تستر جیمیل بودم فرستادم که فکر کنم خوششون هم اومد سایت علیرضا هم تو سایت پارسییک تقریبا همچین کاری رو انجام داده)
روش دادن گزینه تایپ ي و ك توی فرم جستوجو هم پیشنهاد نمیشه و همینی که بالا گفتم بهتر و کاملتر است.
دستآوردهای پایانی:
• یک جاوا اسکریپت برای textarea که به صورت کاربرپسندی بشه لودش کرد مثل ایدهی htmlarea یا تگ id lang=fa من دیدم بعضی جاها برای صفحه کلید فارسی مستقل از یسیتم عامل rtl هم که باشه
• یک جاوا اسکریپت برای input form ها مثلا برای جستوجو یا فیلد نام و … که دوباره خودش لود بشه و مستقل بشه فارسی نوشت rtl فراموش نشود(من این دو تا رو بگردم فکر کنم دارم)
• یک عدد تابع با نام مثلاPost ReplaceFa Function پیش از ذخیرهی متن که پیشفرض تو هر نوشتهای فعال باشه ولی همهجا با یک Check mark بشه نافعالش کرد توی پست توی کامنت و ….
• یک تابع با نام ReplaceFa Function برای جایگزینی پس از ذخیره شدن
• یک تابع هم برای اینکه فرقی بین ي و ی و ک و ك هنگام جستوجو نباشه و در حقیقت or بشوند این ۴ تا نویسه ۲ به ۲
پیوندهای مفید رو بعدا اضافه میکنم الان کپک زدم :D