سلام دوستان. برای یه قسمتی از برنامه یه پروژه به مشکل برخوردم. میخواستم بدونم این محیط های واژه پرداز چطوری فارسی تایپ می کنند ؟
تمام حروف فارسی را در نظر بگیرید. هر حرف حداقل 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 حالت را دارد. مثل د . که یه حالت خود د و حالت دیگه د چسبان است. بیشتر حرفها هم حداکثر 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 رو برمیگردونه
نمیدونم تونستم منظورم رو بفهمونم یا نه . اگه نه که بگید چند تا عکس بزارم
ممنون
دیدگاه