PDA

View Full Version : مشکل در تغییر رنگ اعراب ها در یک متن عربی.



hdv212
چهارشنبه 02 خرداد 1386, 11:13 صبح
سلام وخسته نباشید.
یه برنامه هست که متون عربی رو با اعراب هاش نشون میده، من میخوام کاری کنم که اعراب ها به رنگ دیگه ای نمایش داده بشه،فرض کنید مثلا برای تغییر رنگ اعراب فتحه و کسره از کد زیر استفاده کردم :


string fathe = "َ";
string kasre = "ِ";

//change fathe to red color
for (int i = 0; i < this.richTextBox1.Text.Length - (fathe.Length + 1); i++)
{
if (this.richTextBox1.Text.Substring(i, fathe.Length) == fathe)
{
this.richTextBox1.SelectionStart = i;
this.richTextBox1.SelectionLength = fathe.Length;
this.richTextBox1.SelectionColor = Color.Red;
}
}

//change kasre to red color
for (int i = 0; i < this.richTextBox1.Text.Length - (kasre.Length + 1); i++)
{
if (this.richTextBox1.Text.Substring(i, kasre.Length) == kasre)
{
this.richTextBox1.SelectionStart = i;
this.richTextBox1.SelectionLength = kasre.Length;
this.richTextBox1.SelectionColor = Color.Red;
}
}

this.richTextBox1.SelectionStart = 0;
this.richTextBox1.SelectionLength = 0;

ولی هیچ اتفاقی نمیافته، با همین روش کلمات رو رنگی میکنم ولی اعراب رو رنگی نمیکنه، میشه کمکم کنید.


در ضمن با عمل مشابهی کدی نوشتم که اعراب ها رو در متن حذف کنه و این کار رو میکنه به غیر از اعراب مدی که در کلمه ی الضَّآلِّینَ نوشته شده، هر کار میکنم این مد حذف نمیشه، اگه لطف کنید کد درستشو به من بدید، کد حذف اعراب ها رو به این صورت نوشتم :


string alef_1 = "ﺇ";
string alef_2 = "ﺃ";
string alef_3 = "ﺁ";
string alef_4 = "إ";
string text = this.richTextBox1.Text;
this.richTextBox1.Text = text.Replace(alef_1, "ﺍ");
this.richTextBox1.Text = text.Replace(alef_2, "ﺍ");
this.richTextBox1.Text = text.Replace(alef_3, "ﺍ");
this.richTextBox1.Text = text.Replace(alef_4, "ﺍ");

و


string hamze_1 = "ﺄ";
string hamze_2 = "ﺂ";
string hamze_3 = "ﺈ";
string text = this.richTextBox1.Text;
this.richTextBox1.Text = text.Replace(hamze_1, "ﺎ");
this.richTextBox1.Text = text.Replace(hamze_2, "ﺎ");
this.richTextBox1.Text = text.Replace(hamze_3, "ﺎ");

ARA
چهارشنبه 02 خرداد 1386, 12:37 عصر
سلام
باز مثل همیشه لطف کن یک نمونه قابل اجرا از کدت رو بگذار تا ما دیگه وقت نگذاریم که اونا رو به صوررت پروژه دربیاریم تست کنیم و چک کنیم و کمک کنیم D:

hdv212
چهارشنبه 02 خرداد 1386, 12:46 عصر
سلام ARA جان، عذر میخوام ازت، اینم نمونه برنامه.
برای سوال قسمت اول برای تغییر رنگ اعراب ها روی دکمه Highlight Diacratics کلیک کن که باید اعراب های فتحه و کسره به رنگ قرمز در بیاد(که نمیاد)

برای سوال قسمت دوم درباره حذف علامت مد، روی دکمه ی Remove Madd و Remove Hamze Chasban کلیک کن(تو هیچ کدوم واکنش نشون نمیده)

باز هم مرسی

ARA
چهارشنبه 02 خرداد 1386, 15:20 عصر
سلام من برنامتون رو چک کردم البته کمی هم fاهاش ور رفتم میدونی مشکل کجاست
اون صحیح مینویسه ولی مشکل تو نشون دادنه
برای این که مطمئن شم اسم خودم رو با اعراب تو ورد نوشتم و اعراب رو به رنگ دیگه تغییر دادم همونطور که تو عکس پایین میبینی هنگامی که space میزنم و حروف رو از هم جدا میکنم اعراب رنگی دید میشوند ولی هنگامی که روی حروف قرار میگیرند به رنگ همان حرف تغییر رنگ میدهند
فکر کنم بصورت یک قانونه : اعراب به رنگ حرفی که روی آن قرار گرفته اند دیده میشوند
باید به یک فکر دیگه باشی :چشمک:
مثلا overrwrite کردن متد paint

داری رو قرآن کار میکنی :قلب: من یک زمانی تو یک همچین گروهی بودم ولی ما با پرل کار میکردیم چون با عربی هیچ مشکلی نداشت و میدونی که پرل به عنوان ربانی برای پردازش متن شناخته میشه
اگه کمکی لازم بود خبرم کن خوشحال میشم بتونم کاری بکنم :چشمک:

hdv212
چهارشنبه 02 خرداد 1386, 16:27 عصر
مرسی ARA جان، برای پاک کردن اعراب های متن عربی یه تابع توپ پیدا کردم که اینکار رو انجام میده و مشکل من هم حل میشه :


//this method that remove diacritic from orginal text (s)
public String RemoveDiacritics(String s)
{
String normalizedString = s.Normalize(NormalizationForm.FormD);
StringBuilder stringBuilder = new StringBuilder();

for (int i = 0; i < normalizedString.Length; i++)
{
Char c = normalizedString[i];
if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
stringBuilder.Append(c);
}

return stringBuilder.ToString();
}

ولی مشکل تغییر رنگ اعراب ها کماکان سر جای خودش باقیه، تازه یه مشکل دیگه فرض کنید کاربر یه کلمه ی بی اعراب رو در متن عربی جستجو کنه، خب ما متنها رو در میاریم یکی یکی اعراب هاشو با کد بالایی حذف میکنیم، و توش جستجو میکنیم،اگه کلمه تو متن بود اونو نمایش میدیم(البته متن با اعراب رو)، حالا میخوام کلمه ی مورد جستجو که بی اعراب هست توی متن بااعراب رنگی بشه، حالا چطور حدس بزنیم که اون کلمه اعرابش چی بوده تا توی متن عربی به درستی رنگی بشه ؟

فرض کنید کاربر کلمه ی 'نستعین' رو جستجو میکنه، حالا مثلا در سوره ی حمد که پیدا کرده، کلمه ی 'نَسْتَعِینُ' رنگی بشه یا همون 'نستعین' رنگی بشه، ولی باز اعراب ها رو چطور نادیده بگیره ؟
مرسی

ARA
چهارشنبه 02 خرداد 1386, 18:20 عصر
عزیزم مثل اینکه نمیدونی regular expression دقیقا واسه همین کاره لازم نیست اعراب رو پاک کنی

چون در کلمات با قاعده میتوان یک شرط رو چک کرد باشد یا نباشد

مثلا ذالک رو میشود هم با ک با فتحه match کرد و هم با ک با ضمه و کسره

رو رگیولار اکسپرشن یک کم بیشتر مطالعه کن

چون خیلی بیشتر از اونی که فکر میکنی میتونه کمکت کنه

hdv212
چهارشنبه 02 خرداد 1386, 19:44 عصر
نمونه ای به زبان دات نت داری که اون مشکل رو نداشته باشه ؟؟ (اگه یادت باشه تو پروژه ی من کار نمیکرد، تو پروژه ی جدید هم درست کار نمیکرد)
جستجو در این مورد زیاد کردم، یه چیزایی هم پیدا کردم ولی علامتهاشو زیاد نتونستم پیدا کنم بعضی هاشو مثل *,^,?,[] رو فهمیدم ولی بقیه شو نتونستم بفهمم، مرجعی هم پیدا نکردم. میشه کمکم کنی ؟
آخه چطور میشه بهش فهموند که توی جستجو اعراب ها رو در نظر نگیره ؟

hdv212
پنج شنبه 03 خرداد 1386, 11:27 صبح
عزیزم مثل اینکه نمیدونی regular expression دقیقا واسه همین کاره لازم نیست اعراب رو پاک کنی

ARA جان تا اونجایی که من تو جستجوهام خوندم، بیشتر برای اعتبارسنجی یا validation به کار میره، به هر حال من یه آموزش 50 صفحه ای پیدا کردم که بخونم، مطمئنی نیاز منو براورده میکنه ؟ مرسی

حامد مصافی
پنج شنبه 03 خرداد 1386, 12:34 عصر
سلام
@ hdv212 (http://www.barnamenevis.org/forum/member.php?u=14084) :
دوست عزیزم می تونم حدس بزنم در ذهن شما چی میگذره!

شما می خواهید متن رو در دو فیلد (با اعراب و بی اعراب) ذخیره کنید؟؟ درسته؟؟

در اینصوررت باید بعرض کنم که مشکلاتی هم خواهید داشت

1 - مشکل محل اعراب در متن اصلی
2 - مشکلی که در تاپیک اصلی (در بخش VB.NET) با عنوان مشکل "من" از اون یاد کرده بودم

توضیح : اگر کاربر کلمه مَن (با فتحه) رو جستجو کنه کلمه مِن (با کسره) هم در لیست نتایج ظاهر میشه.

برام جای تعجب داره شما چطور نتونستید کد من رو در #C استفاده کنید!!!

اگر با همون روش مشکل شما حل میشه بفرمایید تا به #C باز نویسیش کنم


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


موفق باشید

ARA
پنج شنبه 03 خرداد 1386, 14:06 عصر
سلام
در من انجام شدن این کار با پرل رو 100 % امکان پذیر میدونم چون باهاش کار کردیم با همین متد
#C نیز از همون pattren Matching و regular expression استفاده میکنه باید بتونه

در مورد کمک اون چیزی که فکر کنم بدردت بخوره تو این لینکهای پایین میتونی پیدا کنی مشکل بود در خدمتیم

http://www.radsoftware.com.au/articles/regexlearnsyntax.aspx
http://www.radsoftware.com.au/articles/regexsyntaxadvanced.aspx
http://www.windowsdevcenter.com/pub/a/oreilly/windows/news/csharp_0101.html

hdv212
جمعه 04 خرداد 1386, 17:00 عصر
اگر با همون روش مشکل شما حل میشه بفرمایید تا به #C باز نویسیش کنم

اگه زحمت بکشی تبدیلش کنی ممنون میشم، البته خودم تبدیل کردم، ARA عزیز هم تبدیل کرده ولی سورس نداشت، اگه میشه شما تبدیلش کن و سورسش رو هم بذار. مرسی

حامد مصافی
شنبه 05 خرداد 1386, 19:17 عصر
اگه زحمت بکشی تبدیلش کنی ممنون میشم، البته خودم تبدیل کردم، ARA عزیز هم تبدیل کرده ولی سورس نداشت، اگه میشه شما تبدیلش کن و سورسش رو هم بذار. مرسی

سلام
من همون کلاس رو در یک پروژه #C استفاده کردم
http://blackdal.persiangig.com/Sources/Csharp/ArabicSearch.rar

hdv212
شنبه 05 خرداد 1386, 20:55 عصر
BlackDal عزیز من متن عربی شما رو با متن عربی با اعراب کامل عوض کردم، (یکی از دوستان توی همین سایت یه برنامه ی قرآن نوشته بود، من این متن رو از اونجا برداشتم)
این کامپوننت برای این متن دیگه جواب نمیده، شما هم یه امتحانی بکنید.

ARA
یک شنبه 06 خرداد 1386, 09:57 صبح
مطمئنی عزیز :متفکر:

hdv212
یک شنبه 06 خرداد 1386, 11:08 صبح
خب ARA جان شما صراط رو با اعراب هاش . به صورت 'صِرَاطَ' جستجو کردی، از 'صراط' استفاده کن، ببین جواب نمیده

ARA
یک شنبه 06 خرداد 1386, 13:31 عصر
خوب معلومه که جواب نمیده

من که بهت گفتم و لینکهایی هم واست گذاشتم تا از reqular expression استفاده کنی