امروز (جمعه) بالاخره وقت کردم توضیحات تکمیلی رو قرار بدم
حالا لازم میدونم در ابتدا چند نکته مهم و کاربردی رو برای دوستان بگم بعد برم سراغ خود برنامه.
•ما در اینجا صحبتمون روی استاندارد یونی کد هست برای نگارش فارسی
•هر حرف در سیستم یونی کد دارای یک کد خاص به خودش هست نمونههای زیر رو ببینید:
ی=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 جایگزین فضای خالی قبل از "ها" میشه تا برای مثلا کلمه "جمع ها" که درستش "جمعها" هست, به شکل "جمعها" در نیاد.
-در مورد پسوند "های" مثل بالا عمل میشه اما برای پیشوندهای "می" و "نمی" با توجه به پیشوند بودنشون برعکس بالا عمل میشه.