/// تبدیل یک رشته ایران سیستم به یونیکد
/// </summary>
/// <param name="iranSystemEncodedString">رشته ایران سیستم</param>
/// <returns></returns>
public static string UnicodeFrom(TextEncoding textEncoding, string iranSystemEncodedString)
{
// وهله سازی از انکودینگ صحیح برای تبدیل رشته ایران سیستم به بایت
Encoding encoding = Encoding.GetEncoding((int)textEncoding);
// حذف فاصله های موجود در رشته
iranSystemEncodedString = iranSystemEncodedString.Replace(" ", "");
if (iranSystemEncodedString.Length <= 0)
return "";
// تبدیل رشته به بایت
byte[] stringBytes = encoding.GetBytes(iranSystemEncodedString.Trim());
// تغییر ترتیب بایت هااز آخر به اول در صورتی که رشته تماماً عدد نباشد
if (!IsNumber(iranSystemEncodedString))
{
stringBytes = stringBytes.Reverse().ToArray();
}
// آرایه ای که بایت های معادل را در آن قرار می دهیم
// مجموع تعداد بایت های رشته + بایت های اضافی محاسبه شده
byte[] newStringBytes = new byte[stringBytes.Length + CountCharactersRequireTwoBytes(stringBytes)];
int index = 0;
// بررسی هر بایت و پیدا کردن بایت (های) معادل آن
for (int i = 0; i < stringBytes.Length; ++i)
{
byte charByte = stringBytes[i];
// اگر جز 128 بایت اول باشد که نیازی به تبدیل ندارد چون کد اسکی است
if (charByte < 128)
{
newStringBytes[index] = charByte;
}
else
{
// اگر جز حروف یا اعداد بود معادلش رو قرار می دیم
if (CharactersMapper.ContainsKey(charByte))
{
newStringBytes[index] = CharactersMapper[charByte];
}
}
// اگر کاراکتر ایران سیستم "لا" بود چون کاراکتر متناظرش در عربی 1256 "ل" است و باید یک "ا" هم بعدش اضافه کنیم
if (charByte == 242)
{
newStringBytes[++index] = 199;
}
// اگر کاراکتر یکی از انواعی بود که بعدشان باید یک فاصله باشد
// و در عین حال آخرین کاراکتر رشته نبود
if (charactersWithSpaceAfter.Contains(charByte) && Array.IndexOf(stringBytes, charByte) != stringBytes.Length - 1)
{
// یک فاصله بعد ان اضافه می کنیم
newStringBytes[++index] = 32;
}
index += 1;
}
// تبدیل به رشته و ارسال به فراخواننده
byte[] unicodeContent = Encoding.Convert(encoding, Encoding.Unicode, newStringBytes);
string result = Encoding.Unicode.GetString(unicodeContent).Trim();
result = result.Replace("ڑ", "ء").Replace("ؤ", "ئ");
//در صورتی که عدد داخل رشته نیست نیاز به ادامه کار نمی باشد
if (!Regex.IsMatch(result, @"\d"))
return result;
bool isLastDigit = false;
string tempForDigits = "";
string str="";
for (int i = 0; i < result.Length; i++)
{
if (Regex.IsMatch(result[i].ToString(), @"\d") || (i+1<result.Length && Regex.IsMatch(result[i].ToString() + result[i+1].ToString(), @"/\d")))
{
isLastDigit = true;
tempForDigits += result[i];
}
else
{
if (isLastDigit && tempForDigits.Length > 0)
{
str += new string(tempForDigits.Reverse().ToArray());
isLastDigit = false;
tempForDigits = "";
}
str += result[i];
}
if (!String.IsNullOrWhiteSpace(tempForDigits) && i == result.Length - 1)
{
str += new string(tempForDigits.Reverse().ToArray());
}
}
return str;
}