الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

إخفاء / إظهار التشكيل في النصوص العربية

مغلق
بدأه bahmani في 23 يوليو 2006 · 19 رد · 3,136 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم وحمة الله

لقد لاحظت في بعض البرامج العربية خاصية تقوم بإظهار التشكيل وإخفائه حسب الطلب.

كيف يمكن برمجة هذه الخاصية ؟.

وفقكم الله ولكم الشكر سلفا

#2

السلام عليكم

هل سؤالي غير مفهوم أم هو صعب إلى هذه الدرجة :unsure: ، أم أن هذه الخاصية لا يمكن برمجتها بالديلفي؟؟؟ :angry:

أرجو مساعدتكم

وفقكم الله.

#3
bahmani كتب:
السلام عليكم

هل سؤالي غير مفهوم أم هو صعب إلى هذه الدرجة :unsure: ، أم أن هذه الخاصية لا يمكن برمجتها بالديلفي؟؟؟ :angry:

أرجو مساعدتكم

وفقكم الله.

السلام عليكم

لا تغضب اخي...

سؤالك غير متعلق بلغة البرمجة، سواء دلفي او غيره...

شخصيا لا اعرف الإجابة عن هذا السؤال،

لأنني لم اصادف هذه المشكلة لقلة تعاملي مع اللغة العربية...

ربما لو وضعت رابط برنامج به هذه الخاصية او ارفقته ليتم تفحصه والبحث عن الإجابة....

d4baa0.gif
#4

كلام الاخ محمد صحيح لا علاقة للسؤال بلغة البرمجة بحد ذاتها

و اذا وجدت الخوارمية اللازمة للعمل يمكنك ان تقوم بذلك بديلفي او غيرها

لكن حول موضوع اللغة العربية و التشكيل كان الاخ عروة قد طرح مكونا كتبه هو

كان قد طرحه مع شيفرته يقوم هذا المكون بالبحث مع اخذ حالة الكلمة بعين الاعتبار ان كانت مشكلة او لا

قد تستفيد من شيفرة المكون

رابط موضوع الاخ عروة صعب ان اضعه لان مشاركاته ما شاء الله كثيرة لكن يمكنك البحث في موقعه

لكني سأضع المكون

ArFindar.zip

اللهم صل و سلم على سيدنا محمد

كاف و نون خلقهم و فنائهم كاف و نون

عالمي شاشة و لغتي صفر و واحد

Just Smile ............You can do it

When you stop learning ... You stop leading

لساني بنطقي صامت عنه عادل............وقلبي بصمتي ضاحك منه هازل

وأتـعـب من نـاداك من لا تـجيبـه............وأغـيظ من عـاداك من لا تـشاكـل

مدونتي الشخصية : Tammam Koujan

آخر مواضيع المدونة :

#5

السلام عليكم

محمدعبد العزيز كتب:

السلام عليكم

لا تغضب اخي...

سؤالك غير متعلق بلغة البرمجة، سواء دلفي او غيره...

شخصيا لا اعرف الإجابة عن هذا السؤال،

لأنني لم اصادف هذه المشكلة لقلة تعاملي مع اللغة العربية...

ربما لو وضعت رابط برنامج به هذه الخاصية او ارفقته ليتم تفحصه والبحث عن الإجابة....

إخواني محمد عبد العزيز Tammam Koujan شكرا لاهتمامكما بالموضوع.

لا أعرف برنامجا على النت فيه هذه الخاصية، الصورتين التاليتين تبينان النص في الحالتين (إظهار/ إخفاء) الصور ملتقطة من { المكتبة الشاملة}

1-

25_07_06_06_49_20_1153835360image1.jpg

2-

25_07_06_06_55_20_1153835720image_.jpg

ألا توجد في (TMEMO) أو في مكون آخر خاصية فيلتر لـ (Code ASCII)؟ مجرد فكرة

ةفقكم الله

#6

الصورة توضح السؤال فقط، الأمر يحتاج برنامج للدراسة...

bahmani هل يمكنك ارفاق ملفين لنفس النص

واحد مع الشكل

والثاني دون شكل

ربما يفيد في ايجاد فكرة او حل...

d4baa0.gif
#7

في الملفين المرفقين نص في الأول مشكل وفي الثاني بدون تشكيل

لقد فكرت في حفظ النص مرتين بالتشكيل وبدونه واستدعاء النص المناسب لكن لاحظت أن الخاصية تكون بطيئة عندما يكون النص خبيرا كما انه يلزم مجهود مضاعف في كتابة النص

Ficier1.txt

Fichier2.txt

#8

bahmani أنت تعتقد أن التشكيل هو أمر متداول وأنه من الممكن أن يوجد خاصية للتحكم به, لكن ذلك مغاير للواقع نظرا لعدم دعم اللغة العربية

بالنسبة للبرنامج الذي رأيت به هذه الخاصية فأعتقد أن النص المخزن لديه يكون مع تشكيل, وعن طلب إظهار النص بدون تشكيل فيقوم البرنامج بطلب إجرائية تقوم بحذف التشكيل من النص الأساسي

هناك خوارزميات تقوم بعملية معاكسة أي أخذ النص بدون تشكيل وإضافة التشكيل له ولكنها خوارزميات معقدة تتبع لقواعد نحو اللغة العربية, كما أن هذه الخوارزميات لديها نسبة خطأ ولا تصل إلى التشكيل الصحيح 100%

يرجى توضيح أي عملية تمثل ما تحتاجه لكي نستطيع مساعدتك

#9

هل التشكيل يعتبر أحرف unicode مثله مثل باقي الحروف العربية؟

يعني يمكنك فلترة النص من كل أحرف التشكيل وعرضها فيما بعد.

http://www.unicode.org:80/charts/PDF/Unico....0/U40-0600.pdf

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#10

ikossan:

ممكن مرة ثانية تقوم بالتنبيه أنك ستكتب رد من سطرين فقط :D

كنت ناوي أكتب رد وحين وجدت أنك تقرأ الموضوع في نفس اللحظة , قلت إذا حيكون رد مطول ولو كتبت قبلك رد قصير-خصوصاً ان وقت النوم حان -ما راح تكون حلوة :D

نرجع للموضوع

اقتباس
النص المخزن لديه يكون مع تشكيل, وعن طلب إظهار النص بدون تشكيل فيقوم البرنامج بطلب إجرائية تقوم بحذف التشكيل من النص الأساسي

أظن هذه عملية أكثر في حالة الآخ .. الطريقة العكسية معقدة جداً وستحتاج إلى وقت كبير لإنجازها وفي الآخير لن تحصل على نتائج صحيحة 100%

اقتباس
يعني يمكنك فلترة النص من كل أحرف التشكيل وعرضها فيما بعد.

كما قال الأخ مراد تماماً ولكن في هذه الحالة النص لا بد أن يكون محفوظاً بتشفير اليونيكود ...

ما أعنيه لا بد من تحديد الطريقة التي سيتم حفظ النص فيها والتي سيترتب عليها تحديد الطريقة لقراءة النص ...

إقرأ عن UTF8,UTF16 وغيرها ....

===

وددت إضافة شئ .. حيث أنك ستعمل برنامج يهتم باللغة العربية فيفضل أن يكون البرنامج داعم للغة العربية بشكل كامل ...

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#11

:lol:

OK يا عم cipher المرة القادمة سأكتب عدد السطور قبل أن أشارك :D

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#12

أنا بحثت منذ فترة على النت عن برنامج يقوم بتشكيل النصوص العربية و تعبت كتير و بدون نتيجة ....

و لكن منذ حوالي 3 شهور ... قام أحد الشباب بكتابة برنامج يقوم بتشكيل أي نص عربي ... أنا لا أستطيع خدمتكم في شيء إلا أن أعطيكم رقم هاتفه أو إيميله ... و بإمكانكم التواصل معه للحصول على البرنامج

أكيد ما أنا هالشخص :D

بس هو خريج كلية الهندسة المعلوماتية في دمشق (ذكاء صنعي) و من الشباب المميزين حاليا في اختصاصه ... و قد جربت البرنامج بنفسي و كان رائعا و كي لا أبالغ كانت نسبة الخطأ أقل من 0.01 %

أما عن سؤال الأخ أصلا أنه يوجد طريقة للتحكم من خلال memo مثلا بالتشكيل .... فيا ريت ... لأن الموضوع كان سيصبح بسيطا جدا

MAAAAAAAAAAAAAAAAAAAAAAAC

#13

السلام عليكم

من زمان عنكم يا اصحابي ... : )

اتوقع والله اعلم ان الحل بسيط .... فقط بتغيير نوع الخط

بعض الخطوط تكون بدون تشكيل ... جرب تغير الخط الى : Simplified Arabic Fixed

وبالتوفيق .

#14

السلام عليكم ورحمة الله

أولا أعتذر على التأخر في الرد لانشغالي ببعض الأعمال

ثانيا : أشكر كل الإخوة الذين أبدوا إهتماما بالموضوع

بالنسبة لرد الأخ 1/11/2004 رغم أن المثال الذي وضعته بالنسبة لتغيير الخط يعطي النتيجة المرجوة إلا أني لا أراه الحل الأمثل لأن المستجدم سيلاحظ تغير الخط وهذا غير جيد (في نظري)، شكرا لمساهمتك.

لقد حاولت استنادا لرد الأخ fh_feras برمجة الخوارزمية المطلوبة فكانت كالتالي

function TForm1.WothoutTashkeel(AText: WideString): WideString;
Const
  shakeels = 'ó' + 'ö' + 'õ' + 'ú' + 'ø' + 'ð' + 'ò' + 'ñ' + '~';
var
  i : Integer;

begin
Result := AText;
For i:=1 to Length(shakeels) do
  begin
	Repeat
	  if Pos(shakeels, Result) > 0 then delete(Result,Pos(shakeels, Result), 1);
	until Pos(shakeels, Result) <= 0
  end;
end;

ملا حظة لقد أعتمدت على مصدر مكون البحث للأخ للعروة حفظه الله

أعطى النتيجة المرجوة :rolleyes: لكن ألاحظ بأنه يصبح بطيئا مع النصوص الكبيرة :unsure:

هل يوجد حل آخر ؟ أم يمكن تغيير الخوارزمية لتعمل بشكل أسرع ؟

السلام عليكم

وفقني الله و أياكم

عفوا

في الكود السابق لم تظهر قيم الثابث Shakeels

فهذا الثابت يجمع جميع أنواع الشكل في اللغة العربية : الفتحة، الضمة، الكسرة، الشدة، الفتحتين، ...

#15

لدين تساؤلين :

* النص العربي محفوظ بأي صيغة؟

*هل تضمن هذه الطريقة على أنظمة لغة الواجهه فيها ليست هي اللغة العربية؟

"First they ignore you, then they laugh at you, then they attack you, then you win"

===

اقتباس

حُكَّامُـنَا إِنْ تَصَـدّوا لِلْحِمَــى اقْتَحَمُـوا ***** وَإِنْ تَصَدَّى لَـهُ المُسْتَعْمِـرُ انْسَحَبُـوا

هُمْ يَفْرشـُونَ لِجَيْـشِ الغَــزْوِ أَعْيُنَـهُـمْ ***** وَيَدَّعُــونَ وُثُـوبَـاً قَـبْـلَ أَنْ يَثِـبُــوا

الحَاكِمُـونَ و«وَاشُنْـطُـنْ» حُكُومَتُـهُـمْ ***** وَاللامِعُــونَ وَمَـا شَعَّـوا وَلا غَرَبُــوا

القَاتِلُـــونَ نُبُــوغَ الشَّـعْــبِ تَرْضِـيَـــةً ***** لِلْمُعْتَدِيــنَ وَمَـا أَجْـدَتْـهُـمُ الـقُــرَبُ

لَهُمْ شُمُـوخُ «المُثَنَّـى» ظَاهِـرَاً وَلَهُـمْ ***** هَـوَىً إِلَـى بَابَـك الخَرْمِـيّ يُنْتَسَـبُ

البردوني "أبو تمام وعروبة اليوم" 1971

===

اقتباس
عبيد الهوى يحكمون البـلاد ***** ويحكمهــم كلّهـــم درهــــــم

و تقتـادهـم شهـوة لا تنــام ***** وهـــم فـي جـهالتهــم نــــوّم

ففــي كـــلّ ناحيــة ظـالـــم ***** غبــــــيّ يسـلـّطــــه أظلـــم

أيا من شبعتم على جوعــنا ***** وجـــوع بنينـا ألـم تتخمـــوا ؟

ألم تفهموا غضبة الكادحين ***** على الظلـم ؟ لا بدّ أن تفهموا

البردوني "نحن و الحاكمون "

#16

ما الذي يفترض أن تقوم به هذه الخوارزمية .. لم تقم بشيء ... !!!!!

MAAAAAAAAAAAAAAAAAAAAAAAC

#17

بإمكانك تعديل الإجرائية التي قمت بكتابتها لتختزل ثلث الوقت أي تصبح الإجرائية أسرع بمرة ونصف من القديمة وذلك بحذف شرط واستدعاء لتابع Pos لا لزوم لهما كالتالي

function WothoutTashkeel(AText: WideString): WideString;
Const
  shakeels = 'ó' + 'ö' + 'õ' + 'ú' + 'ø' + 'ð' + 'ò' + 'ñ' + '~';
var
  i, SPos: Integer;
begin
  Result:= AText;
  for i:= 1 to Length(shakeels) do
  begin
	SPos:= Pos(shakeels, Result);
	while SPos > 0 do
	begin
	  Delete(Result, SPos, 1);
	  SPos:= Pos(shakeels, Result);
	end;
  end;
end;
#18

ومن أجل التعرف على كل أحرف التشكيل بإمكانك أن تستخدم شرط للمقارنة بين رمز المحرف ومجال أحرف التشكيل بطريقة مختلفة مشابهة

الإجرائية كتبتها بكود C++ ولا يوجد عندي Delphi لكي أجربها بكود Pascal

//---------------------------------------------------------------------------
#define IsTashkeel(x) (((x >= 0x064B) && (x <= 0x0652)) || ((x >= 0x06D5) && (x <= 0x06E4)) || ((x >= 0xFC5E) && (x <= 0xFC62)) || ((x >= 0xFCF2) && (x <= 0xFCF4)) || ((x >= 0xFE70) && (x <= 0xFE7F)))
//---------------------------------------------------------------------------
WideString __fastcall RemoveTashkeelEx(WideString strSource)
{
  for ( int i = 1; i <= strSource.Length(); i++ )
  {
	if ( IsTashkeel(strSource) )
	{
	  strSource.Delete(i, 1);
	  i--;
	}
  }
  return strSource;
}
//---------------------------------------------------------------------------

تعطي هذه الإجرائية من حيث السرعة أداء مشابه للإجرائية السابقة بعد تحسين سرعتها

كما أنها تعطي نصا خاليا تماما من أحرف التشكيل

أنا لا أتعامل مع اللغة العربية بشكل كبير :P لذلك أعتقد أنه يجب أن نسأل عن مجالات أحرف التشكيل أو شيء من هذا القبيل

أما المجالات في الإجرائية فقد استنتجتها من CharacterMap ;)

#19

السلام عليكم

شكرا أخي fh_feras على تواصلك واهتمامك بالموضوع، أريد فقط بأني على علم من قبل من أن الموضوع ليس سهل لكن طرحته هنا ليتمكن الجميع من المساهمة والبحث عن الطريقة المثلى لحل هذا المشكل.

أما من ناحية التعامل مع اللغة العربية فأنا شخصيا ضعيف في هذا المجال

لقد حاولت تطبيق ما أشرت به في مداخلتك السابقة فأعطت النتائج التاليةأولا :

function TForm1.WothoutTashkeel1(AText: WideString): WideString;
var
 i: Integer;
 X : WideChar;
begin
  Result := AText;
  For i := Length(Result) Downto  1do
	begin
	  X := Result;
	  if IsTashkeel(X) then Delete(Result, i, 1)
	end;
end;

function TForm1.IsTashkeel(X: WideChar): Boolean;

Const
  SetShakels  = 'ó' +'ö' + 'õ' + 'ú' + 'ø' + 'ð' + 'ò' + 'ñ' + '~';
begin

Result := (Pos(X, SetShakels) > 0);

end;

لا حظت أن هذا الكود يختزل الوقت إلى النصف تقريبا بالمقارنة مع الكود السابق

function TForm1.WothoutTashkeel3(AText: WideString): WideString;
var
 i: Integer;
 X : WideChar;
 S : String;
begin
  Result := AText;
  For i := Length(Result) Downto  1do
	begin
	  X := Result;
	  S := WideCharToString(@X);
	  if IsTashkeel1(Ord(S[1])) then Delete(Result, i, 1)
	end;

end;

function TForm1.IsTashkeel1(X: Integer): Boolean;
begin
Result := ((X >= $00F0) and (X <= $00F3)) or (X = $00F5) or (X = $00F6) or (X = $00F8) or (x = $00FA);
end;

لاحظت أن هذا الأخير له نفس السرعة مع الكود السابق

ملاحظة : لقد قمت بالمقارنة باستعمال نص كبير نسبيا (سورة البقرة)

النص يحفظ بالتشكيل في قاعدة البيانات (أو في ملف) ونقوم بحدف التشكيل

أرجو المواصلة في النقاش ليستفيد الجميع

السلام عليكم ورحمة الله

#20

لا شكر على واجب ;)

كنت سأقول لك أن تضع الشرط بالكود الأخير ضمن الإجرائية وليس بتابع من أجل اختصار زمن استدعاء هذا التابع ولكن Delphi ستقوم أثناء Compile بعملية Optimization وتفعل ذلك <_<

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…