PDA

View Full Version : سوال: بدست آوردن کد اسکی کاراکترهای کلمات فارسی بصورت یونیکد



mrmehdi
چهارشنبه 06 آذر 1398, 02:50 صبح
سلام دوستان
کسی سورس کد یا رفرنسی برای جداکردن کاراکترهای کلمات فارسی بصورت یونیکد داره؟
من میخوام فرضا این کلمه < سیب‌> تک تک کاراکترهاش رو بصورت س اول ی وسط و ب اخر کد اسکی هاشون رو دربیارم
ممنون میشم راهنمایی کنید

the king
چهارشنبه 06 آذر 1398, 18:58 عصر
سلام دوستان
کسی سورس کد یا رفرنسی برای جداکردن کاراکترهای کلمات فارسی بصورت یونیکد داره؟
من میخوام فرضا این کلمه < سیب‌> تک تک کاراکترهاش رو بصورت س اول ی وسط و ب اخر کد اسکی هاشون رو دربیارم
ممنون میشم راهنمایی کنید
چرا که نه. اول زحمت می کشید و این لیست رو تکمیل می کنید، یعنی هر چی کاراکتر عربی و فارسی هست به لیست اضافه می کنید که حالت های بهم چسبیده و نچسبیده شون چطوریه :

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


public partial class FormMain : Form
{
private class GlyphData
{
public readonly char Isolated;
public readonly char Initial;
public readonly char Medial;
public readonly char Final;

public GlyphData(char isolated, char final, char medial, char initial)
{
Isolated = isolated;
Final = final;
Medial = medial;
Initial = initial;
}
}

public FormMain()
{
InitializeComponent();
}

private Dictionary<char, GlyphData> _glyphs;

private void button1_Click(object sender, EventArgs e)
{
textBox2.Text = Separate(textBox1.Text);
}

private string Separate(string text)
{
if (_glyphs == null)
{
_glyphs = new Dictionary<char, GlyphData>();

// START
// Copy code here

_glyphs.Add('\u0633', new GlyphData('\ufeb1', '\ufeb2', '\ufeb4', '\ufeb3'));
_glyphs.Add('\u0649', new GlyphData('\ufeef', '\ufef0', '\ufef4', '\ufef3'));
_glyphs.Add('\u06cc', new GlyphData('\ufbfc', '\ufbfd', '\ufbff', '\ufbfe'));
_glyphs.Add('\u0628', new GlyphData('\ufe8f', '\ufe90', '\ufe92', '\ufe91'));
_glyphs.Add('\u0648', new GlyphData('\ufeed', '\ufeee', '\ufeee', '\ufeed'));
_glyphs.Add('\u0622', new GlyphData('\ufe81', '\ufe82', '\ufe82', '\ufe81'));
_glyphs.Add('\u06af', new GlyphData('\ufb92', '\ufb93', '\ufb95', '\ufb94'));

// FINISH

}
var s = new StringBuilder();
var isolated = true;
for (var i = 0; i < text.Length; i++)
{
GlyphData glyphData;
if (_glyphs.TryGetValue(text[i], out glyphData) == false)
{
s.Append(text[i]);
if (char.GetUnicodeCategory(text[i]) != System.Globalization.UnicodeCategory.NonSpacingMar k)
{
isolated = (text[i] != '\u0640');
}
continue;
}
var joined = false;
for (var j = i + 1; j < text.Length; j++)
{
if (char.GetUnicodeCategory(text[j]) == System.Globalization.UnicodeCategory.NonSpacingMar k)
{
continue;
}
if (text[j] == '\u0640')
{
joined = true;
break;
}
GlyphData nextGlyph;
if (_glyphs.TryGetValue(text[j], out nextGlyph))
{
joined = (nextGlyph.Isolated != nextGlyph.Final);
}
break;
}
if (isolated)
{
s.Append((joined) ? glyphData.Initial : glyphData.Isolated);
isolated = ((joined == false) || (glyphData.Initial == glyphData.Isolated));
}
else
{
s.Append((joined) ? glyphData.Medial : glyphData.Final);
isolated = ((joined == false) || (glyphData.Medial == glyphData.Final));
}
}
return s.ToString();
}


این متد Separate اون کاراکتر که کلمات رو کش میده (تطویل) و کاراکتر های تکمیلی مثل تشدید و تنوین و ... رو میشناسه و مشکلی باهاشون نداره.

برنامه ای که کد رو تکمیل می کنه :
151041

mrmehdi
سه شنبه 12 آذر 1398, 12:00 عصر
چرا که نه. اول زحمت می کشید و این لیست رو تکمیل می کنید، یعنی هر چی کاراکتر عربی و فارسی هست به لیست اضافه می کنید که حالت های بهم چسبیده و نچسبیده شون چطوریه :

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


public partial class FormMain : Form
{
private class GlyphData
{
public readonly char Isolated;
public readonly char Initial;
public readonly char Medial;
public readonly char Final;

public GlyphData(char isolated, char final, char medial, char initial)
{
Isolated = isolated;
Final = final;
Medial = medial;
Initial = initial;
}
}

public FormMain()
{
InitializeComponent();
}

private Dictionary<char, GlyphData> _glyphs;

private void button1_Click(object sender, EventArgs e)
{
textBox2.Text = Separate(textBox1.Text);
}

private string Separate(string text)
{
if (_glyphs == null)
{
_glyphs = new Dictionary<char, GlyphData>();

// START
// Copy code here

_glyphs.Add('\u0633', new GlyphData('\ufeb1', '\ufeb2', '\ufeb4', '\ufeb3'));
_glyphs.Add('\u0649', new GlyphData('\ufeef', '\ufef0', '\ufef4', '\ufef3'));
_glyphs.Add('\u06cc', new GlyphData('\ufbfc', '\ufbfd', '\ufbff', '\ufbfe'));
_glyphs.Add('\u0628', new GlyphData('\ufe8f', '\ufe90', '\ufe92', '\ufe91'));
_glyphs.Add('\u0648', new GlyphData('\ufeed', '\ufeee', '\ufeee', '\ufeed'));
_glyphs.Add('\u0622', new GlyphData('\ufe81', '\ufe82', '\ufe82', '\ufe81'));
_glyphs.Add('\u06af', new GlyphData('\ufb92', '\ufb93', '\ufb95', '\ufb94'));

// FINISH

}
var s = new StringBuilder();
var isolated = true;
for (var i = 0; i < text.Length; i++)
{
GlyphData glyphData;
if (_glyphs.TryGetValue(text[i], out glyphData) == false)
{
s.Append(text[i]);
if (char.GetUnicodeCategory(text[i]) != System.Globalization.UnicodeCategory.NonSpacingMar k)
{
isolated = (text[i] != '\u0640');
}
continue;
}
var joined = false;
for (var j = i + 1; j < text.Length; j++)
{
if (char.GetUnicodeCategory(text[j]) == System.Globalization.UnicodeCategory.NonSpacingMar k)
{
continue;
}
if (text[j] == '\u0640')
{
joined = true;
break;
}
GlyphData nextGlyph;
if (_glyphs.TryGetValue(text[j], out nextGlyph))
{
joined = (nextGlyph.Isolated != nextGlyph.Final);
}
break;
}
if (isolated)
{
s.Append((joined) ? glyphData.Initial : glyphData.Isolated);
isolated = ((joined == false) || (glyphData.Initial == glyphData.Isolated));
}
else
{
s.Append((joined) ? glyphData.Medial : glyphData.Final);
isolated = ((joined == false) || (glyphData.Medial == glyphData.Final));
}
}
return s.ToString();
}


این متد Separate اون کاراکتر که کلمات رو کش میده (تطویل) و کاراکتر های تکمیلی مثل تشدید و تنوین و ... رو میشناسه و مشکلی باهاشون نداره.

برنامه ای که کد رو تکمیل می کنه :
151041
بسیار متشکرم ازتون دوست عزیز:بوس::بوس::بوس: