سلام
اصل مشکل شما در این تاپیک از این نقطه آغاز میشود که XP و Vista و Win7 ای که نصب کرده اید دستکاری شده !
یعنی معمولاً شرکت داخلی CD یا DVD کرک شده چینی و روسی را برداشته و مثلاً آمده فارسی سازیش کند و خیلی میبخشید ولی گند زده !
(سعی کنید ویندوزی نصب کنید که تاحد امکان دستکاری نشده باشد و نرم افزار و ابزار اضافه ای نداشته باشد و خودتان دستی در ControlPanel کیبورد فارسی اش را نصب کنید.)
یا اینکه امکان دارد به جای نصب کیبورد فارسی با نماد Fa کیبورد عربی با نما Ar نصب شده باشد.
همیشه و همواره کیبورد فارسی را از داخل خود ControlPanel استاندارد ویندوز نصب کنید.
حروف "پ" و "ژ" هم امکان دارد با نوشتار کیبور قدیمی شما سازگار نباشد ولی ایرادی ندارد ...
اگر کیبورد ویندوز را با خود ControlPanel دستکاری نشده مایکروسافت نصب کنید برای درج "ژ" باید "Shift+C" زده شود و "پ" هم کاراکتر "\" خواهد بود.
==============
من دو تابعی که گفتم را به dll خودم اضافه کردم.
باید ghnet.dll را به پروژه خود reference کنید ...
--- تابع GHNet.Text.PersianText.Compare دو String را مقایسه میکند و اگر برابر باشند صفر برمیگرداند.
--- تابع GHNet.Text.PersianText.ToPersianUnicode هم یک String ورودی را گرفته و تمام کاراکترهای الفبای فارسی را به کاراکترهای استاندارد کیبورد فارسی شده با خود XP و Vista و Win7 تبدیل میکند که این تبدیل را میتوان تبدیل استاندارد یونیکدی فارسی فرض کرد.
تابع فوق به نوعی قاتل تمام حروف و علائم خاص عربی است همه حروف همزه دارد و نقطه زیاد در بالا و پایین دارد و... را با حروف استاندارد کیبورد فارسی تعویض میکند.
باید مجدد اخطار کنم که تابع فوق کلیه حروف و علایم خاص فارسی و عربی نقطه زیاد و همزه دار را به حروف عادی تبدیل میکند.
تنها اثتثنا در مورد "آ" ی با کلاه است که با کلاه و بدون کلاهش (!) صحیح حفظ خواهد شد و از بین نمیرود ولی سایر الفهای همزه دارد هم همه به الف عادی تبدیل میشوند.
تابع فوق سایر حروف و علایم غیر فارسی را دست نخورده و صحیح حفظ خواهد کرد.
=====
دو تابع فوق در نوع خود با بهترین کدنویسی و بازدهی سرعتی نوشته شده اند و در آنها از کدهای unsafe برای پردازش استفاده شده و تا حد امکان سعی شده اصول سرعت بالای پردازش در آنها رعایت شود.
==============
چطور می تونیم ک عربی یا ي عربی را از کی فارسی و ی فارسی تشخیص داد ؟ من یک تکس باکس دارم و خودم بصورت فارسی در بانک جملا را می نویسم ، حالامی خوام اون ها را با چیزی که کاربر وارد می کند مقایسه کنم ، ولی اگه زبان ویندوز کاربر نسخه عربی باشه ، اشتباه می شه ، حالا راه حل چیه . چطور می تونم رشته کاربر رو جستجو کنم ، اگر ک عربی بود تبدیل به ک فارسی بشه
راه حل کامل و نهایی شما ان است که اول کل دیتابیس را بخوانید (یا DataReader و یا با DataSet) و کل اطلاعات String این جدول را با تابع ToPersianUnicode به متون استاندارد فارسی تبدیل کنید و تمام اطلاعات را مجدد Save کنید. (یا با Command و یا همان DataSet و DataAdapter)
این عمل مشابه نرم افزاری و درون برنامه ای کاری است که کاربر Sub Zero در پست 7 گفتند و مشکل حروف و علایم ناهنجار داخل دیتابیس را رفع میکند.
اینکار فقط کافی است یک بار انجام شود.
(البته میتوانید امکانی در جایی در چندان در دسترس در برنامه جای دهید که بتوان در صورت صلاحدید با یک کلیک کل دیتابیس را با روش فوق بازتولید کرد و کاراکترهای ناهنجار را تصحیح کرد.)
حالا مشکل من اینجاست ، که کاربر متن رو وارد می کنه ، من در بانک بصورت ک فارسی نوشتم ولی اگه کاربر ک عربی وارد کنه ، فکر می کنه که برنامه درست کار نمی کنه ، حالا اگه من در بانکم ک عربی وارد کنم ممکنه که کاربر ک فارسی وارد بکنه دوباره فکر می کنه که اشتباه وارد کرده .
و اما برای مشکل آینده هم همانطور که در پست 5 گفتم، بهترین راه چاره ان است که تابع ToPersianUnicode را قبل از هر UPDATE و INSERT فراخوانی کنید.
یعنی مثلاً به جای کد اولی در زیر کد دوم را بنویسید:
Dim str1 As String = Me.PersianTextBox1.Text
Dim str2 As String = GHNet.Text.PersianText.ToPersianUnicode(Me.Persian TextBox1.Text)
اگر از کد پیشنهادی دوم در مبادی ورودی و یا قبل از تغییرات دیتابیس استفاده کنید، تضمین میکنید که امکان ندارد کاراکترهای ناهنجار وارد دیتابیس شوند و برنامه خودکار همه کاراکترهای غیر استاندارد را به معادل استاندارد آن جایگزین میکند.
=====
کد نمونه برای استفاده از دو تابع فوق:
Dim str_farsi As String = "ی" & "ک" & "و"
Dim str_arabic As String = "ﻱ" & "ݢ" & "ۋ"
Dim str_farsi_2 As String = GHNet.Text.PersianText.ToPersianUnicode(str_arabic )
System.Windows.Forms.MessageBox.Show( _
If((String.Compare(str_farsi, str_arabic) = 0), "str_farsi = str_arabic", "str_farsi <> str_arabic"))
System.Windows.Forms.MessageBox.Show( _
If((GHNet.Text.PersianText.Compare(str_farsi, str_arabic) = 0), "str_farsi = str_arabic", "str_farsi <> str_arabic"))
System.Windows.Forms.MessageBox.Show( _
If((String.Compare(str_farsi, str_farsi_2) = 0), "str_farsi = str_farsi_2", "str_farsi <> str_farsi_2"))
==============
این پکهای ریر ربطی به تاپیک فعلی ندارند ولی پوشه bin نشان حاوی آخرین نسخه این dll هستند.
http://support.h02.ir/fwlink/?LinkId=1005415457
http://support.h02.ir/fwlink/?LinkId=1001372507
http://support.h02.ir/fwlink/?LinkId=1005350577
http://support.h02.ir/fwlink/?LinkId=1002435777
http://support.h02.ir/fwlink/?LinkId=1006193017
(ضمنا در مورد حرف "ک" که مورد بحث تاپیک است، dll فوق توانایی شناسایی 14 نوع کاراکتر مختلف "ک" را دارد.)
موفق باشید.