# Native Code > برنامه نویسی در 6 VB > مطالب مرتبط با بانکهای اطلاعاتی در VB6 >  مشکلات زبان فارسی و جستجو در بانک اطلاعاتی

## mehdi_7070

با سلام

یک تاپیک برای مشکلات زبان فارسی بود ، ولی متاسفانه به نتیجه‌ای نرسیدم .

این تاپیک را برای مشکل زبان فارسی در زمینه‌ی جستجو در بانک اطلاعاتی ایجاد کردم .

الان من یک بانک اطلاعاتی دارم که قرار هست درون یک جدول که اطلاعات به زبان فارسی هست جستجو انجام بشه . اما ممکن هست کاربر من با "ی" و "ک" عربی این جستجو را انجام بده و به همین دلیل نتونه جستجو بکنه .
به اضافه‌ی اینکه وقتی توی تکست‌باکس با ی فارسی هم تایپ می‌کنی ، باز ی عربی که دو نقطه زیرش هست نشون داده میشه (با فونت Tahoma) می‌خواستم ببینم علتش چیه/

ممنون میشم اگر در این زمینه راهنمایی بفرمایید .

----------


## mlh_poorranjbar

من هم قبلا این مشکل  رو داشتم و بعدها متوجه شدم مشکل از اینه که من اطلاعات رو مستقیما وارد بانک (SQL) میکردم. ولی اگر اطلاعات رو از داخل برنامه درون بانکتون ذخیره کنید این مشکل حل خواهد شد . چون با این کار "ی" ذخیره میشه و موقع جستجو هم "ی" جستجو میشه

----------


## mehdi_7070

ممنون از راهنمايي‌تون دوست عزيز!
من بانك اطلاعاتيم access هست ، ميشه بگي چه جوري بايد اين كار را بكنم؟

----------


## مهدي هراتي

به نظر من فرقي نميكنه كه اطلاعات از چه محلي به بانك اطلاعاتي وارد ميشن. من هم اين مشكل رو داشتم و بالاخره به اين صورت حلش كردم كه قبل از ذخيره اطلاعات در يك ركورد، با يك Replace ساده "ي" ها و "ك" ها رو جايگزين مي كنم و سپس اطلاعات رو ثبت مي كنم.
به همين صورت قبل از انجام عمل جستجو هم ابتدا رشته مربوطه رو Replace كرده و سپس جستجو را انجام مي دهم.

----------


## mehdi_7070

> به نظر من فرقي نميكنه كه اطلاعات از چه محلي به بانك اطلاعاتي وارد ميشن. من هم اين مشكل رو داشتم و بالاخره به اين صورت حلش كردم كه قبل از ذخيره اطلاعات در يك ركورد، با يك Replace ساده "ي" ها و "ك" ها رو جايگزين مي كنم و سپس اطلاعات رو ثبت مي كنم.
> به همين صورت قبل از انجام عمل جستجو هم ابتدا رشته مربوطه رو Replace كرده و سپس جستجو را انجام مي دهم.


خيلي ممنون دوست عزيز از راهنمايي شما
من نتونستم به صورت درست "ي" را Replace كنم . ميشه كدش را برام بذاريد؟
ممنون  :قلب:

----------


## vb_hamed

سلام
فايل fix.bat رو روي سيستم كاربر اجرا كنيد، مشكلتون با اون حروف حل ميشه
فقط اينكه اگر سي دي ويندوز رو خواست بهش ندين و روي هاردتون هم سورس ويندوز نباشه

----------


## مهدي هراتي

سلام
اجازه بديد كمي موضوع رو عميق تر بررسي كنيم.
از زماني كه PCها در ايران عمومي شدند و نياز كاربران به فارسي ساز مطرح شد شركتهاي متعدد و افراد مختلفي اقدام به ارائه فارسي ساز تحت عناوين مختلف نمودند. در اين ميان فارسي سازهايي كه Keymap شركت ايران سيستم را پشتيباني مي كردند براي مصارف اداري مناسب تر از بقيه بودند و مورد استقبال قرار گرفتند.
وقتي ويندوز 95 و سپس 98 از راه رسيدند اين اتفاق تكرار شد و باز شركتهايي به ارائه فارسي ساز براي ويندوز پرداختند كه در اين ميان محصول شركت برنا رايانه (ويندوز پارسا) بدليل پشتيباني از استاندارد ايران سيستم و راحتي استفاده، عمومي شد.
ويندوز پارسا در اصل يك ويندوز با پشتيباني از زبان عربي بود كه با ايجاد تغييراتي (افزودن حروف، تعريف Keymap و ...) براي فارسي زبانان بهينه شده بود ولي در اصل از Code Page عربي استفاده مي كرد.

در استاندارد Unicode براي زبان عربي كد اختصاص يافته به حرف "ي" معادل با 1610 و كد اختصاص يافته به حرف "ك" معادل با 1603 مي باشد. اينها همان "ي" با 2 نقطه در زير و "ك" بدون سركش مي باشند. ويندوز پارسا از اين كدها براي فارسي استفاده مي كرد.

با ارائه ويندوز 2000 و سپس ويندوز XP از سوي مايكروسافت و پشتيباني از زبان فارسي به صورت توكار (بدون نياز به نصب نرم افزارهاي اضافي) دو مشكل بوجود آمد.

اول اينكه Keymap ارائه شده از سوي مايكروسافت با آنچه كه ايرانيان به آن عادت داشتند (استاندارد ايران سيستم) سازگار نبود. حروف "ژ" و "پ" سر جاي خود نبودند و حرف "ي" هم مشكل داشت و در وسط كلمه بايد با Shift+X تايپ مي شد. اين مشكل به اين صورت حل شده كه دانشكده كامپيوتر دانشگاه صنعتي شريف يك Keyboard Fixer ارائه داد كه فقط يك فايل DLL با نام kbdfa.dll بود. كاربر مي بايست اين فايل را در حالت Safe Mode در دو مسير Windows\System32 و Windows\System32\dllcache كپي مي كرد تا Keymap اصلاح گردد و مطابق با ايران سيستم شود. در واقع اين فايل بر روي فايل اورجينال مايكروسافت در دو مسير ذكر شده Overwrite مي شد.
در اين ميان يك روش هم از طرف شركت فراسو ارائه شد كه براي شخص من خيلي عجيب است. اين شركت حروف "پ" و "ژ" را (طبق استاندارد مايكروسافت) به صورت توخالي روي كيبوردهاي خود تكرار كرد. كاري كه فراسو انجام داد باعث شد كه برخي كاربران (مخصوصا تازه واردها) به استاندارد مايكروسافت عادت كنند و وقتي پاي يك كامپيوتر مي نشينند كه استاندارد ايران سيستم را دارد (Keyboard fixer بر روي آن نصب شده است) دائما اشتباه تايپ مي كنند و كلافه مي شوند.

مشكل دوم مربوط به كد حروف بود در واقع مايكروسافت براي صفحه كليد فارسي حروف "ک" و "ى" فارسي (با سركش و بدون 2 نقطه) را در نظر گرفته بود. در استاندارد Unicode كد اختصاص يافته به "ک" معادل با 1705 و كد اختصاص يافته به "ى" معادل با 1609 مي باشد. همانطور كه مي بينيد كد "ك" عربي با "ک" فارسي و همچنين كد "ي" عربي با "ى" فارسي متفاوت است. خب اين تفاوت مي تواند در نرم افزارهاي بانك اطلاعاتي مشكل ساز باشد زيرا اطلاعات به صورت باينري ذخيره و بازيابي مي شوند كه در اين حالت "مهدى" با "مهدي" متفاوت است و چنانچه با شكل اول ذخيره شده باشد و با شكل دوم جستجو شود، چيزي پيدا نمي شود.

بنده هميشه Keyboard fixer را اعمال مي نمايم چونكه به ايران سيستم عادت دارم و نمي توانم با استاندارد مايكروسافت كار كنم. يعني روي كامپيوتري كه با آن برنامه نويسي مي كنم "ك" و "ي" را دارم.
در مورد حل اصولي اين مشكل بايد بگويم كه من هم ابتدا براي مشتري هايم keyboard fixer نصب مي كردم و هروقت تماس مي گرفتند و مي گفتند كه ما از وقتي ويندوز يكي از كامپيوترها را عوض كرده ايم ديگر بعضي از اطلاعات پيدا نمي شوند (ولي مي دانيم قبلا ثبت شده اند) به ايشان مي گفتم كه بايد فايل Keyboard fixer را نصب كنند. خب مشتري هم اين كار را مي كرد ولي باز هم مشكل حل نمي شد چونكه مثلا به مدت سه روز از يك كامپيوتر كه ويندوزش جديد بوده و استاندارد مايكروسافت داشته اطلاعاتي حاوي "ک" و "ى" در بانك اطلاعاتي وارد شده و پس از نصب Keybaord fixer ديگر همان كامپيوتر هم نمي تواند اطلاعاتي را كه خودش وارد كرده جستجو كند. به اين صورت ناهماهنگي در بانك اطلاعاتي بوجود مي آمد.
پس مجبور شدم يك بخشي براي تصحيح كدهاي يونيكد در نرم افزارهايم قرار دهم كه تمامي ركوردهاي تك تك جداول بانك اطلاعاتي را Scan كرده و "ک" ها را با "ك" و "ى" ها را با "ي" جايگزين نمايد. اين كار در كل خيلي جالب نبود!
چندي پيش پروژه اي را قرارداد بستم كه بنا بود در يك شبكه متوسط اجرا شود. وقتي نسخه بتا را نصب كردم ديدم از 67 كامپيوتر موجود در شبكه نيمي استاندارد مايكروسافت و مابقي استاندارد ايران سيستم را دارند. اينجا ديگر مشكل بود كه بخواهيم Keyboard fixer روي سيستم ها نصب كنيم. از طرفي تقريبا هر روز روي يكي دو كامپيوتر ويندوز نصب مي كنند و بخش پشتيباني سخت افزارشان اصلا توي اين باغ ها نيست و حرف خودش رو ميزنه.

راه حلي كه انتخاب كردم اينه كه قبل از ارسال هر اطلاعاتي به بانك اطلاعاتي ابتدا Replace ها را انجام دهم. براي اين كار يك تابع نوشتم كه خيلي ساده و روان اين كار را برايم انجام مي دهد. به همين صورت هنگام جستجو هم ابتدا رشته مورد جستجو را به اين تابع ارسال مي كنم تا هماهنگ شود.

در مورد اينكه شما بايد از كاراكترهاي فارسي يا عربي استفاده كنيد من نمي توانم اظهار نظر كنم ولي با روشي كه بيان كردم مي توانيد اطلاعاتتان را (يا فارسي يا عربي) هماهنگ در بانك وارد نماييد.
در همين رابطه يك فايل ايجاد كرده ام كه ليستي از كاراكترها به همراه كدهاي Unicode مربوط به هر كاراكتر مي باشد. اين فايل را ضميمه مي كنم شايد مورد نيازتان باشد.

ببخشيد كه طولاني شد

موفق باشيد

----------


## mehdi_7070

> راه حلي كه انتخاب كرده اينه كه قبل از ارسال هر اطلاعاتي به بانك اطلاعاتي ابتدا Replace ها را انجام دهم. براي اين كار يك تابع نوشتم كه خيلي ساده و روان اين كار را برايم انجام مي دهد. به همين صورت هنگام جستجو هم ابتدا رشته مورد جستجو را به اين تابع ارسال مي كنم تا هماهنگ شود.


از توضیحات کامل شما واقعا متشکر هستم .

من با Replace تونستم "ک" را جایگذاری کنم ، ولی برای "ی" نتونستم . یعنی مثلا برنامه نویس را برنامه نوی‌س می‌کرد . 
میشه در این مورد به من کمک کنید .

با تشکر

----------


## مهدي هراتي

دوست عزيز، من قبلا عرض كردم كه اظهار نظري در مورد اينكه كدام كدها را انتخاب كنيد نمي كنم ولي مثل اينكه مجبورم اين كار را بكنم. متوجه شدم شما به سمت كيبورد مايكروسافت رفتيد يعني "ک" و "ى" را انتخاب كرديد.

اين انتخاب شما را در آينده دچار مشكل مي كند. بزرگترين مسئله عدم مرتب سازي صحيح است. يعني "ک" با كد 1705 بعد از "ى" با كد 1609 قرار مي گيرد (به فايل ضميمه پست قبلي نگاه كنيد). بدين ترتيب وقتي اسامي را Sort مي كنيد "كامران" بعد از "ياسمن" قرار خواهد گرفت! ولي وقتي از "ك" و "ي" استفاده مي كنيد اين مشكل وجود ندارد.

من هم از "ي" با دو نقطه در زير و "ك" بدون سركش خوشم نمياد ولي فعلا مجبوريم از اينها استفاده كنيم تا ببينيم مايكروسافت در SQL Server 2008 در مورد فارسي چكار كرده است.
در ضمن براي خلاصي از نقطه هاي زير "ي" و داشتن سركش روي "ك" مي توانيد از فونتهاي فارسي مناسب استفاده كنيد. همچنين اگر حوصله سرو كله زدن با نرم افزارهاي Font Editor را داريد مي توانيد خودتان با دستكاري كاراكترها، آنها را به شكل مناسب در آوريد.

يك نمونه فونت فارسي با حروف مناسب ضميمه مي كنم شايد مفيد باشد.

موفق باشيد

----------


## VB Master

سلام دوست عزيز مهدي هراتي
اين تابعي كه نوشتي ميشه بزاري ما هم ازش استفاده كنيم ؟
ممنون ميشم

----------


## big lost

سلام در اندروید استودیو یک دستوری داریم به نام replace

اگر مثلا دیتابیس شما عربی هست 
میای با این دستور میگیم که اگر کاربر حروف فارسی تایپ کرد اون رو replace کنه با حرف عربی

search=search.replace("ی","ي")
search=search.replace("ک","ك");

----------


## saeedzx

سلام راحت می تونی با این کد فارسی رو جستجو کنی فقط قبل از ذخیره اطلاعات مثلا از Text نوع فونت را Tahoma و فارسی انتخاب کن 

برای جستجو هم می توانید اگر بانک SQL است از دستور زیر استفاده کنی 

Adodc1.RecordSource = "Select *from bane where name like N'" & Text1.Text & "%'"
Adodc1.Refresh

----------

