اطلاعیه

Collapse
No announcement yet.

مشکل در ایجاد کلمات فارسی در یک محیط دات ماتریسی (پیکسلی)

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل در ایجاد کلمات فارسی در یک محیط دات ماتریسی (پیکسلی)

    سلام دوستان. برای یه قسمتی از برنامه یه پروژه به مشکل برخوردم. میخواستم بدونم این محیط های واژه پرداز چطوری فارسی تایپ می کنند ؟
    تمام حروف فارسی را در نظر بگیرید. هر حرف حداقل 2 حالت را دارد. مثل د . که یه حالت خود د و حالت دیگه د چسبان است. بیشتر حرفها هم حداکثر 4 حالت دارند. مثل ب و پ و ج و ع و ق و ....
    یکی خود ب و دو حالت ب چسبان وسط کلمه و آخری خود ب که در آخر کلمه قرار دارد و بهش میگن چسبان از آخر . مثل "سیب"
    فرض کنید من یه دیتابیس دارم از حروف فارسی که ارتفاع حروف در آن 16 پیکسل است. (دقت کنید در محیط دات ماتریسی یا همون پیکسلی دارم صحبت میکنم. یه دات ماتریس رو در نظر بگیرید. در واقع دقیقا مثل فارسی نویسی برای LCD های گرافیکی)
    از تمام حالتهای ممکن برای حروف فارسی هم در دیتابیس موجودند و هر کدام یک اندیس بخصوص دارند. مشکل من اینه که چطوری اونا رو فراخونی کنم تا کلمه ای که کاربر تایپ کرده ساخته شود.
    تو محیطی مثل Word یا هر جای دیگه هر کلمه ای که تایپ کنید اول حالت اصلی اون کلمه تایپ میشه مثل همون "سیب"
    اول "س" ظاهر میشه. بعد اگه Space رو زدید که "س" همون "س" میمونه. اگه کاراکتر بعد از "س" فاصله یا همون Space نبود "س" حالت چسبان از آخر به خودش میگیره و کاراکتر بعدی بصورت حالت اصلی خودش تایپ میشه و اگه کاراکتر بعدی بازم Space نبود کاراکتر مورد نظر حالت چسبان بخودش میگیره و همینطور ادامه پیدا میکنه تا مثلا بشه سیب
    س + ی = سی و سی + ب = سیب
    همین سیب رو حرف به حرف تو Word تایپ کنید تا متوجه منظورم بشید

    خب منم خواستم همین رو پیاده کنم. یعنی قضاوت برمبنای وجود کاراکتر Space ولی خب مشخصه که همیشه اینطور نیست و حالتهای خاصی وجود داره مثل کلمه "آب" که قبل از "ب" کاراکتر Space وجود ندارد ولی "ب" بصورت حالت اصلی خودش ظاهر میشود و چسبان نیست و "ب" نمیاد به "آ" بچسبه. به زبان ساده تر "ب" در حالت اصلی خودش بکار میره تو کلمه "آب" نه حالت چسبان از اول . یا کلمه "رب" که تو اون "ب" تو حالت چسبان به کار نرفته.

    پس فقط نمیشه برمبنای Space کار کرد. خب حالا من باید چیکار کنم ؟


    دقت کنید محیط مورد نظر دات ماتریس هستش مثل LCD گرافیکی و به همین خاطر طرز کار سیستم های فونت TrueType (تو ویندوز) بدردم نمیخوره هر چند که چیزی درموردش نمیدونم.
    همچنین همونطور که میدونید مثل حروف انگلیسی حروف فارسی هم یه کد اسکی (البته اسکی که نمیشه گفت ولی یه کد منحصر بفرد خودشون رو دارن) منتها مشکل اینجاست که همه حالات یک حرف مثل "ب" کد اسکی شون یکی هستش. یعنی مثلا هر 4 حالت "ب" کد 200 رو دارند و هر 4 حالت "پ" کد 144 که همونطور که میبینید برخلاف حروف انگلیسی کدها پشت سر هم نیستند که اینم یه مشکله برا خودش.
    اگر هر حالت کد خودش رو داشت که مشکل حل بود. ولی اینطور نیست.
    کدهای حروف باری این مهم هستند که من برای مراجعه به دیتابیس از این کدها استفاده می کنم. (دیتابیس یه آرایه یک بعدی از رکوردها هستش که هر رکورد اطلاعات یه حالت از یه حرف رو تو خودش نگه داشته که اون اطلاعات چیزی نیست جز یه ارایه دوبعدی بولی که بخاطر همین گفتم سیستم دات ماتریسی هستش)
    مثلا اندیس حرف "ب" در دیتابیس 14 هستش و سه حالت دیگه حرف "ب" در خونه های 15 و 16 و 17 از دیتابیس قرار دارند.
    الان هر چی تایپ بکنم اگه "ب" توش باشه میره خونه 14 رو برمیداره میچسبونه به خونه های قبلی. در حالی که من باید بتونم بدرستی تشخیص بدم کی خونه 14 رو برداره و چه موقع خونه مثلا 16 رو
    مثلا برای "سیب" باید برای حرف "ب" خونه 15 که "ب اول چسبان" هستش رو فراخونی کنه که الان اینکار رو نمیکنه و هر حالت "ب" که باشه خونه 14 رو برمیگردونه

    نمیدونم تونستم منظورم رو بفهمونم یا نه . اگه نه که بگید چند تا عکس بزارم
    ممنون

    #2
    پاسخ : مشکل در ایجاد کلمات فارسی در یک محیط دات ماتریسی (پیکسلی)

    پست اشتباه زدم

    دیدگاه


      #3
      پاسخ : مشکل در ایجاد کلمات فارسی در یک محیط دات ماتریسی (پیکسلی)

      سلام کسپر جان

      فکر کنم میخوای مثلا کاربر با صفحه کلید یک متنی رو تایپ کنه و روی صفحه ماتریسی خودش به نشون بده؟ (خودش کوچیک و بزرگ بودن حروف رو تشخیص بده)...

      درسته؟

      اگه اینطور نیست که هیچی

      ولی اگه اینطوره :

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

      اگه خواستی بگو که یک تابع نسبتا ساده هست که برات ارسال کنم

      موفق باشید :nerd:

      دیدگاه


        #4
        پاسخ : مشکل در ایجاد کلمات فارسی در یک محیط دات ماتریسی (پیکسلی)

        سلام حامد جان
        بله خب همینه تقریبا. یه صفحه کلید منتها نرم افزاری که حروف فارسی روش قرار داره رو در نظر بگیر
        که این حروف از یه دیتابیس ماتریسی فراخونی میشن. حالا دیتابیسش مهم نیست. یعنی مهم اینه که من بفهمم الان کدوم حالت از حرف درسته که من فراخونیش کنم تا بتونم کلمه موردنظر رو بسازم. محیطی که کاربر باید متن مورد نظرش رو توش ببینه همونطور که گفتم ماتریسی هستش.

        چجور تابعی ؟ تحت چه زبانی ؟
        در مورد روشتون بیشتر توضیح میدی ؟ یعنی چی حروف قبل و بعد کلمه رو از حافظه میگیرید ؟ کدوم حافظه

        دیدگاه


          #5
          پاسخ : مشکل در ایجاد کلمات فارسی در یک محیط دات ماتریسی (پیکسلی)

          کد:
          #define ghabl_is_nachasban (c==5 |c==9 |c==29 |c==53 |c==85 | c==200  )
          
          #define badi_is_chasban (d==1 | d==241 |d==17 |d==21 |d==25 |d==33 |d==37 |d==245 |d==45 | d==49 |d==57 |d==61 |d==65 |d==69 |d==73 |d==77 |d==81 |d==89 |d==93 |d==97 |d==101  |d==5 |d==9 |d==29 |d==53 |d==85 )
          
                                                                                                                                                                       
          
          
          
          char is_back_eq_ch(int num)
          {
          char c,d;
          if (num!=0)
            c=text[num-1]; 
          else
            c=200;
            
          d=text[num+1];
            if((num==0) & badi_is_chasban )
              return 1;
             
            if(ghabl_is_nachasban & badi_is_chasban )
              return 1;
              
            if(!ghabl_is_nachasban & badi_is_chasban )
              return 2;
              
            if (!ghabl_is_nachasban & ! badi_is_chasban)
              return 3;
              
            if(ghabl_is_nachasban & !badi_is_chasban )
              return 4;
          
          }

          این کد رو ببین....

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

          ما برای هر حرفی یه کد در نظر گرفتیم...مثلا برای حرف "د" کد 5 رو انتحاب کردیم...

          الان تو این تابعی که نوشتم ببین

          اگه مثلا حرف قبلش "د" باشه و حرف بعدش هم یه حرفی باشه (فرق نداره چه حرفی) (اگه حرف ورودیت ح باشه ) حـ رو مینویسه ...

          البته این تابع با برگردوندن عدد 1و2و3و4 این کار رو انجام میده ... و بر حسب اون عدد تشخیص میدیم که کدوم حرف هست...

          امیدوارم متوجه شده باشی :nerd:

          دیدگاه

          لطفا صبر کنید...
          X