ايران ويج

نسخه‌ی کامل: فارسی‌نویسی صحیح در برنامه‌ها
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
فارسی‌نویسی درست

این برنامه که به شکل یک کتابخانه درش آورم توابعی داره که به شما کمک می کنه برای تصحیح ایرادات زبان فارسی در برنامه هاتون.

لینک برنامه روی خود سایت
http://www.iranvig.com/4547.html

اول از همه بگم که تمام کد های این برنامه از خودمه و یه نوبت چگونگی عملکرد این توابع رو براتون توضیح می دم.

در کل این برنامه کار های زیر رو انجام میده:
- تمام یاء های نقطه دار یعنی "ي" ها تبدیل می شند به شکل فارسی خودشون یعنی "ی"
- به طور کلی در کلمات جمع "ها" جمع در تایپ صحیح خودش نباید از کلمه قبلیش با یک فاصله جدا باشه. که این برنامه این اصلاح رو انجام می ده.
مثلا این غلطه "جمع ها" اما درستش می شه "جمع‌ها"
- در مورد پیشوند و پسوند هایی مثل "یی,های, می, نمی" هم دو مورد بالا اجرا خواهد شد. یعنی شما رشته خودتون رو به برنامه می دید و برنامه حروف به شکل برگردان صحیح فارسیش به شما تحویل می ده.

درن برنامه ای که دانلود خواهید کرد یک برنامه تست هم هست که درش به خوبی این مسئله نشون داده شده. دو تا فرم رو با هم مقایسه کنید که چه اتفاقی برای نوشته های فارسی شون بعد از اعمال توابع برنامه من افتاده.
توجه کنید که برنامه هایی که به این شکل تصفیه اصطلاح درشون اتفاق بیافته بسیار زیبا تر, شکیل تر و حرفه ای تر هستند.
من خودم دارم دیگه تو تمام پروژه هایی که آوردن زبان فارسی رو احتیاج داره به طور کامل از این کد استفاده می کنم.
اما درون اون کتابخانه چند تا تابع هست که خیلی جالبند در زیر عملکرد هر کدوم رو توضیح دادم:

کد:
Public Function StringCorrectPersian(ByVal StrIn As String) As String
شما رشته فارسی رو وارد این تابع کنید خروجی اون تصحیح شده اون رشته خواهد بود.
توجه کنید در بعضی از انواع پایگاه های داده دوستان دچار مشکل می شند با ذخیره و بازیافت "ي" های نقطه دار که این تابع کمک بزرگی برای اون ها خواهد بود.

کد:
Public Sub SCPO(ObjIn)
شما یک شیئ مثل CommandButton یا Label و یا هر چیزی که لازم هست کلیه متون فارسی اعم از Caption یا Tag یا ToolTipText درون اون شیئ به شکل صحیح خودش درباید, رو وارد این زیر برنامه کنید تا براتون کار رو اتوماتیک انجام بده.

کد:
Public Sub SCPF(FormIn)
و اما تابع جالب دیگه ما همین تابع SCPF است. شما فقط کافیه اسم فرمی که می خواید خود فرم, منو های فرم و تمام اشیای موجود در فرم به شکل صحیح فارسی تبدیل بشند, رو وارد این زیر برنامه کنید این زیر برنامه همه کار ها رو خودش انجام میده.

حالا چطور این برنامه میتونه حروف اشتباه رو تشخیص بده و یا اینکه چطور می تونه حروف صحیح رو جایگزین کند رو براتون توضیح خواهم داد.
دست شما درد نکنه به نظر برنامه جالب و مفیدی میاد. من قبلا به طور دستی همون ابتدای وارد کردن اطلاعات فارسی، اونها رو به طور درست وارد می کردم ولی بعدا به این نتیجه رسیدم که به زحمتش نمی ارزه!!! ولی با این برنامه می شه دوباره اون کار رو از سر گرفت.
الگوریتمش باید به این صورت باشه که داخل متن به دنبال "ی" نقطه دار می گرده و اون رو با کاراکتر صحیح جایگزین می کنه همینطور دنبال "می" و " ها " و ... هم می گرده و اسیس قبل یا بعد اونها رو ( که اضافه هست ) با کاراکتر فاصله جایگزین می کنه.
به نظر ساده میاد ولی احتمال بروز خطا داخل کد برنامه تبدیل شده وجود داره. اگه می شه یه توضیحی در مورد جلوگیری از بروز خطا بدید.
امروز (جمعه) بالاخره وقت کردم توضیحات تکمیلی رو قرار بدم
حالا لازم می‌دونم در ابتدا چند نکته مهم و کاربردی رو برای دوستان بگم بعد برم سراغ خود برنامه.


•ما در اینجا صحبتمون روی استاندارد یونی کد هست برای نگارش فارسی

•هر حرف در سیستم یونی کد دارای یک کد خاص به خودش هست نمونه‌های زیر رو ببینید:
ی= 1609
ي= 1610
بنابراین با توجه به اینکه کد‌های دو حرف "ی" و "ي" از هم مجزا هستند می‌شه از کد یونی اون‌ها برای استفاده و اصلاح در رشته استفاده کرد و نه خودشون.

•برای تبدیل هر عدد یونی کد به حرف معادل خودش در زبان وی بی 6 از عملگر:

کد:
Function ChrW(CharCode As Long(

استفاده می‌شه مثلا (ChrW(1609 معنی همون حرف "ی" یاء بدون نقطه رو می ده.

•در سیستم کد دهی بونی کد کارکتر خاصی وجود داره به اسم NonJoiner با مشخصات:

کد:
    AscW = 8204         ,Hex = 200C

وظیفه این کاراکتر اینه که, اگر بین دو حرف فارسی اومد اون دو حرف رو بدون قید و شرط از هم جدا کنه.
مثلا کلمه "جواد" رو در نظر بگیرید. اگر من حرف (ChrW(8204 بین حرف "ج" و "و" در کلمه جواد بیارم به شکل "ج‌واد" در میاد. خوب می‌بینید با وجود اینکه حرف "ج" و حرف "و" درست بعد از هم اومدند اما به دلیل وجود عملگر NonJoiner که به معنی "بدون اتصال" هست, اون دو حرف به هم نچسبیندند. اینجا من NonJoiner رو عملگر خطاب کردم چون حروفی از این دست در جدول کد‌های یونی بیشتر به یک علگر شبیه هستند تا یک حرف قابل نمایش.

مسئله بعدی اینکه اسم کامل این عملگر در جدول کد‌های یونی ZERO WIDTH NON-JOINER هست که می‌تونید اون رو در برنامه‌ای که قبلا دانلود کردید در ماژول mMain از پروژه FunctionsGJS و با اسم ChNonJoiner مشاهده کنید.

•اما کارکتر خاصی دیگری وجود داره به اسم Joiner با مشخصات:

کد:
    AscW = 8205        ,Hex = 200D

این کاراکتر هم یک عملگره و دقیقا برعکس کاراکتر قبلی عمل می‌کنه. یعنی اگر بین دو حرف فارسی بیاد اون دو حرف به هم می‌چسبند.
اسم کامل این عملگر در جدول کد‌های یونی ZERO WIDTH JOINER هست که می‌تونید اون رو در ماژول mMain با اسم ChJoiner مشاهده کنید.

•کارکتر خاصی دیگری وجود داره به اسم کامل LEFT-TO-RIGHT MARK با مشخصات:

کد:
    AscW = 8206          ,Hex = 200E

این کاراکتر هم یک عملگر هست و وظیفش اینه که اگر در ابتدای یک رشته اومد نوع نمایش اون رشته رو تبدیل کنه به استاندارد چیدمان چپ به راست. در برنامه من با اسم CHL2RN مشخص شده اما این کاراکتر برای ما مهم نیست چون ما در فارسی راست به چپ داریم که مورد بعدی توضیح دادم و خیلی مهمه.

•کارکتر خاصی دیگری وجود داره به اسم کامل RIGHT-TO-LEFT MARK با مشخصات:

کد:
    AscW = 8207          ,Hex = 200F

این کاراکتر هم یک عملگر هست و وظیفش اینه که اگر در ابتدای یک رشته اومد نوع نمایش اون رشته رو تبدیل کنه به استاندارد چیدمان راست به چپ یعنی برای زبان خودمان فارسی. در برنامه من با اسم CHR2LN مشخص شده و این کاراکتر اهمیت و کاربرد بالایی داره. این نکته برای خیلی از برنامه‌نویس‌های فارسی زبان مهم خواهد بود.

* برای اعمال خط الرسم فارسی (عربی) در محیط‌هایی که اجازه راست به چپ کردن رشته‌ها درش وجود نداره (مثل خصوصیت ToolTipText کنترل‌های وی بی) شما کافیه کاراکتر (ChrW(8207 رو به اون رشته اضافه کنید.

فقط برای اینکه این مورد کامل براتون جا بیافتد من مجبور شدم دوباره برنامه رو آپ لود کنم که درش همین مورد هم ذکر شده. ToolTipText


اما توضیح در مورد الگوریتم استفاده شده در برنامه:

-برای یاء‌های نقطه دار طبق توضیحاتی که در بالا عنوان شد خیلی سادست از فرمان زیر برای جایگزین کردن "ي" ها با شکل درستشون یعنی "ی" استفاده می‌شه:

کد:
Replace(StrIn,ChrW$(1610),ChrW$(1609))


-اما در مورد پسوند "ها", برای اینکه اشتباهی رخ نده از همین خاصیت پسوند بودنش استفاده می‌شه. یعنی اونجا‌هایی که بعد از "ها" فاصله باشه و با شرط اینکه حرف ماقبل "ها" یکی از حروف مجاز (حروف معمول زبان فارسی و نه علائم و نشانه‌ها) باشد و حرف قبل از "ها" فضای خالی باشد, یک کاراکتر (ChrW(8204 یا (ChrW(NonJoiner جایگزین فضای خالی قبل از "ها" می‌شه تا برای مثلا کلمه "جمع ها" که درستش "جمع‌ها" هست, به شکل "جمعها" در نیاد.

-در مورد پسوند "های" مثل بالا عمل می‌شه اما برای پیشوند‌های "می" و "نمی" با توجه به پیشوند بودنشون برعکس بالا عمل می‌شه.
ممنون که توضیح دادی . استفاده از یونی کد و کدهایی که گفتی مخصوصا برای Tooltip خیلی جالب بود. آقا جواد ( اگه درست گفته باشم ) کلا طرح برنامه و الگریتمهای اون خیلی جالب هست . فکر می کنم اگه بشه روش کار کرد تا به صورت یه تولبار در محیط برنامه نویسی یا محیط های ویرایشگر متن مثل ورود آماده اش کنیم خیلی خیلی کاربردی بشه. اگه موافق باشید با هم روش کار کنیم. ( حتی شاید بشه تو پروژه های گروهی روش کار کرد )
Di Di نوشته است:فکر می کنم اگه بشه روش کار کرد تا به صورت یه تولبار در محیط برنامه نویسی یا محیط های ویرایشگر متن مثل ورود آماده اش کنیم خیلی خیلی کاربردی بشه. اگه موافق باشید با هم روش کار کنیم. ( حتی شاید بشه تو پروژه های گروهی روش کار کرد )
این درخواستی که دادی فکر نمی کنم زیاد کار ببره. متاسفانه من وقتم کامل پره اما شما کار رو شروع کن در بخش پروژه های گروهی من قول همکاری می دم.
ممنون ازت . عجب توابع و توضیحات کاملی منم خیلی مشکل با فارسی بخصوص توی بانک اطلاعاتی دارم واقعیتش اصلا هم نمیدونستم چطور میشه رفعش کرد. ممنون واقعا زحمت کشیدی.
یکی از دوستان سوال کرده بود چطور می شه تاریخ به شکل اعداد فارسی در کنترل MaskText مایکروسافت داشت.

من با اطلاعات همین تاپیک برنامه ضمیمه رو نوشم که چکونگی این کار رو درش می بینید.
خیلی خیلی سادست کد ها رو مطالعه کنید.
سلام دوستان

من این توابع رو لازم دارم اگه میشه یکی واسم دوباره آپلود کنه خیلی ضروریه

با تشکر