تبدیلگر ایران سیستم به یونیکد
نویسنده: وحید نصیری
تاریخ: ۱۳۹۱/۰۷/۲۵ ۱۷:۴۳
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
var connectionString = "Provider=VFPOLEDB.1;Data Source=D:\path\rep.dbf;Password=;Collating Sequence=MACHINE";
// the text is standard CP1252 ASCII Encoding cp1252 = Encoding.GetEncoding(1252); // تبدیل رشته به بایت byte[] stringBytes = cp1252.GetBytes(iranSystemEncodedString.Trim());
return Encoding.GetEncoding(1256).GetString(newStringBytes);
stringBytes = stringBytes.Reverse().ToArray();
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;
} باسلام؛ من در رابطه با تبدیل کدهای ایران
سیستم با یک مشکل متفاوت مواجه شدم که گویا خیلی خاص است چون ندیدم کسی در این
رابطه سوالی مطرح کند و آن اینکه من فایل DBF را
در فرم خود باز میکنم اما کدهای قبل از تبدیل به ویندوز که مشاهده میشه هیچ شباهتی
به کدهای معادل در ایران سیستم
ندارد و این تحت شرایطی است که من از فارسی بودن و تحت کدپیچ ایران سیستم بودن حروف
آینDBF مطمئن
هستم چون با برنامههای فارسی ساز اماده موجود در اینترنت کاملا درست فارسی میشود .
بعضی از دوستان راهنمایی کردن که
اشکال در کانکشن و مشخص نکردن codepage=850 هست ولی باز هم نتیجه نگرفتم. کانکشنی که من استفاده میکنم :
@"Driver={Microsoft dBASE Driver (*.dbf)};DriverID=850;SourceType=DBF;Data Source=" + FileAdress + ";Extended Properties=\"dBase III\";Locale Identifier=\"850\";"
در رابطه با مشکل حروف، dbf مورد نظر را نیز به پیوست ارسال میکنم: JVJ100.DBF
// from http://www.microsoft.com/en-us/download/details.aspx?id=14839
var connectionString = "Provider=VFPOLEDB.1;Data Source=" +
@"D:\path\JVJ100.DBF" +
";Password=;Collating Sequence=MACHINE";
using (var dbConnection = new OleDbConnection(connectionString))
{
using (var dataAdapter = new OleDbDataAdapter("select FAMILY from JVJ100.DBF", dbConnection))
{
using (var dataset = new DataSet())
{
dataAdapter.Fill(dataset, "table1");
foreach (DataRow dataRow in dataset.Tables[0].Rows)
{
var familyIranSystem = dataRow[0] as string;
var familyIranUnicode = ConvertTo.Unicode(familyIranSystem, 1256);
if (!string.IsNullOrWhiteSpace(familyIranUnicode))
{
}
}
}
}
} string dbfDirectory = Server.MapPath("~/Content/") + "myDBF.dbf";
string connectionString = "Provider=VFPOLEDB.1;Data Source=" + dbfDirectory + ";Password=;Collating Sequence=MACHINE";
using (OleDbConnection connection = new OleDbConnection(connectionString))
{
connection.Open();
string CreateTableK = "Create Table myDBF (dsw_id1 int, dsw_fname v(250), dsw_lname v(250) )";
OleDbCommand cmdCreateTable = new OleDbCommand(CreateTableK, connection);
cmdCreateTable.ExecuteNonQuery();
OleDbCommand cmd2 = new OleDbCommand("Insert Into myDBF Values (1, @param1, @param2)", connection);
cmd2.Parameters.AddWithValue("@param1", "شهرزاد");
cmd2.Parameters.AddWithValue("@param2", "جواهری");
OleDbCommand cmd3 = new OleDbCommand("Insert Into myDBF Values (2, 'ma', 'bi')", connection);
cmd2.ExecuteNonQuery();
cmd3.ExecuteNonQuery();
connection.Close();
} //ایجاد بانک اطلاعاتی خالی
var dir = @"D:\Prog\"; // این مسیر پوشه است و نه مسیر فایل
using (OleDbConnection connection = new OleDbConnection(@"Provider=VFPOLEDB.1;Data Source=" + dir))
{
using (var command = new OleDbCommand())
{
command.Connection = connection;
command.Connection.Open();
command.CommandText = "Create Table myDBF (dsw_id1 int, dsw_fname v(250), dsw_lname v(250) )";
command.CommandType = CommandType.Text;
command.ExecuteNonQuery();
}
} //ثبت اطلاعات در بانک ایجاد شده
var dbPath = Path.Combine(dir, "myDBF.dbf");
using (OleDbConnection connection = new OleDbConnection(@"Provider=VFPOLEDB.1;Data Source=" + dbPath))
{
using (var command = new OleDbCommand())
{
command.Connection = connection;
command.Connection.Open();
command.CommandText = "Insert Into myDBF Values (1, ?, ?)";
command.Parameters.AddWithValue("?", "B"); // فقط علامت سؤال در اینجا کار میکند و نه هیچ چیز دیگری
command.Parameters.AddWithValue("?", "A");
command.CommandType = CommandType.Text;
command.ExecuteNonQuery();
}
} string ascii = Encoding.ASCII.GetString(list.ToArray());
List<byte> IS_Result = new List<byte>();
//for (int i = 0; i < limit; i++)
for (int i = limit - 1; i >= 0; i--)
{
if (is_Lattin_Letter(b22[i]))
{
cur = get_Lattin_Letter(b22[i]);
IS_Result.Add(cur);
pre = cur;
}
else if (i != 0 && i != b22.Length - 1)
{
cur = get_Unicode_To_IranSystem_Char(b22[i - 1], b22[i], b22[i + 1]);
if (cur == 145) // برای بررسی استثنای لا
{
if (pre == 243)
{
IS_Result.RemoveAt(IS_Result.Count - 1);
IS_Result.Add(242);
}
else
{
IS_Result.Add(cur);
}
}
else
{
IS_Result.Add(cur);
}
pre = cur;
}
}
Set @Result = replace(@Result, char(145)+char(243), char(242))
Set @Result = replace(@Result, char(243)+char(145), char(242)) Set @Result = replace(@Result, char(242)+char(243), char(242)+char(145)+char(243))