PDA

View Full Version : مشکل فایل متنی با فرمت utf



delafarin
دوشنبه 24 آبان 1389, 21:33 عصر
با سلام
در دلفی من یک فایل متنی با فرمت utf-8 دارم که وقتی می خواهم اطلاعات آنرا وارد یک tabel در access بکنم بر روی یک سطر از فایل متنی می ماند و مدام loop می زند بعد رفتم اون سطر بخصوص رو پاک کردم دیدم اثری نداشت بعدا متوجه شدم که کاری به اون سطر بخوص نداره بلکه تعداد سطرهای محدودی را یک فایل متنی با فرمت utf می پذیرد تا در برنامه نویسی loop نزند
حالا نمی دونم چکار کنم چون نمی تونم تعداد سطرهای فایل رو حذف کنم چون باید حتما باشد واگر نه تعدادی از اطلاعات از بین می رود
اصلا چطور می تونم بدون loop همه اطلاعات رو توی dbgride بیارم ؟؟؟؟؟؟؟؟؟؟؟
البته الان من دستی با save as کردن آن با فرمت ansi مشکل رو حل کردم ولی می خوام با برنامه نویسی بدون دست زدن به فایل این کار رو بکنم .

vcldeveloper
دوشنبه 24 آبان 1389, 21:52 عصر
نه نسخه دلفی تون مشخص هست، و نه کدی که برای خواندن آن فایل نوشتید.

delafarin
دوشنبه 24 آبان 1389, 23:30 عصر
نه نسخه دلفی تون مشخص هست، و نه کدی که برای خواندن آن فایل نوشتید.

delphi 7
/////////////////////////////////

فایل رو نیز ضمیمه کردم
با تشکر.....

vcldeveloper
سه شنبه 25 آبان 1389, 02:49 صبح
خب، این کد که فقط میاد یه فایل رو میخونه و میریزه در یک Memo. نیازی نبود برای این کار این همه کد بنویسید، اون با استفاده از روش های کار با فایل قدیمی پاسکال. کافی بود می نوشتید:


Memo1.Lines.LoadFromFile('MyFileName.txt');

البته دقت کنید که VCL در دلفی 7 از یونیکد پشتیبانی نمیکنه. در نتیجه اگر فایل شما یونیکد باشه، لود کردنش در Memo در دلفی 7، موجب خراب شدن داده ها میشه. اگر محتوای فایل UTF-16 هست، و میخواید بریزیدش در فیلد بانک، بهتره که مستقیما از فیلد بانک مربوطه استفاده کنید، و اون رو در Memo نمایش ندید:


uses WideStrings;


var
WSList : TWideStringList;
begin
WSList := TWideStringList.Create;
try
WSList.LoadFromFile('MyFileName.txt');
ADOTable1.FieldByName('MyField').AsWideString := WSList.Text;
finally
WSList.Free;
end;
end;


اگر میخواید حتما نمایش داده بشه، باید از کنترل هایی استفاده کنید که یونیکد باشند، مثل کامپوننت های مجموعه TNT Components.

اگر محتوای فایل تون UTF-8 هست، باید اول UTF-8 رو به ANSI یا UTF-16 تبدیل کنید، بعد باهاش کار کنید.


اگر مجبور نیستید از دلفی 7 استفاده کنید، بهتره که برید با دلفی 2010 کار کنید، و خیال خودتون از بابت این مسائل راحت کنید. دلفی 2009 و نسخه های بعد از آن کاملا از یونیکد پشتیبانی می کنند.

delafarin
سه شنبه 25 آبان 1389, 08:53 صبح
خب، این کد که فقط میاد یه فایل رو میخونه و میریزه در یک Memo. نیازی نبود برای این کار این همه کد بنویسید، اون با استفاده از روش های کار با فایل قدیمی پاسکال. کافی بود می نوشتید:


Memo1.Lines.LoadFromFile('MyFileName.txt');

البته دقت کنید که VCL در دلفی 7 از یونیکد پشتیبانی نمیکنه. در نتیجه اگر فایل شما یونیکد باشه، لود کردنش در Memo در دلفی 7، موجب خراب شدن داده ها میشه. اگر محتوای فایل UTF-16 هست، و میخواید بریزیدش در فیلد بانک، بهتره که مستقیما از فیلد بانک مربوطه استفاده کنید، و اون رو در Memo نمایش ندید:


uses WideStrings;


var
WSList : TWideStringList;
begin
WSList := TWideStringList.Create;
try
WSList.LoadFromFile('MyFileName.txt');
ADOTable1.FieldByName('MyField').AsWideString := WSList.Text;
finally
WSList.Free;
end;
end;


اگر میخواید حتما نمایش داده بشه، باید از کنترل هایی استفاده کنید که یونیکد باشند، مثل کامپوننت های مجموعه TNT Components.

اگر محتوای فایل تون UTF-8 هست، باید اول UTF-8 رو به ANSI یا UTF-16 تبدیل کنید، بعد باهاش کار کنید.


اگر مجبور نیستید از دلفی 7 استفاده کنید، بهتره که برید با دلفی 2010 کار کنید، و خیال خودتون از بابت این مسائل راحت کنید. دلفی 2009 و نسخه های بعد از آن کاملا از یونیکد پشتیبانی می کنند.


با سلام و تشکر از حس مسئولیت شما
**من در پست اول توضیح دادم با تبدیل utf_8 به ansi با روش دستی (save as کردن فایل با ansi)
این مشکل رو حل کردم حالا می خوام تبدیل utf_8 به ansi رو با برنامه انجام بدم که به کاربرم نگم که این کار رو با فایل ، دستی انجام بده .
**در مورد ریختن از فایل به memo هم کاملا حق با شماست منتها من همه کرکترهامو نمی خواستم توی memo بیاره و در اصل من از این فایل اطلاعات خاص رو استخراج کردم که دیگه اونا رو من در این پست قرار ندام.
**متاسفانه باید حتما از دلفی 7 استفاده کنم .

با تشکر مجدد.

delafarin
سه شنبه 25 آبان 1389, 13:05 عصر
با سلام و تشکر از حس مسئولیت شما
**من در پست اول توضیح دادم با تبدیل utf_8 به ansi با روش دستی (save as کردن فایل با ansi)
این مشکل رو حل کردم حالا می خوام تبدیل utf_8 به ansi رو با برنامه انجام بدم که به کاربرم نگم که این کار رو با فایل ، دستی انجام بده .
**در مورد ریختن از فایل به memo هم کاملا حق با شماست منتها من همه کرکترهامو نمی خواستم توی memo بیاره و در اصل من از این فایل اطلاعات خاص رو استخراج کردم که دیگه اونا رو من در این پست قرار ندام.
**متاسفانه باید حتما از دلفی 7 استفاده کنم .

با تشکر مجدد.




ببخشید در اصل کوتاه بگم چطور از طریق برنامه نویسی دلفی7 میتوان یک فایل با فرمت utf-8 رو به ANSI تبدیل کرد .

vcldeveloper
سه شنبه 25 آبان 1389, 23:16 عصر
ببخشید در اصل کوتاه بگم چطور از طریق برنامه نویسی دلفی7 میتوان یک فایل با فرمت utf-8 رو به ANSI تبدیل کرد .
میخواید اون رو به ANSI تبدیل کنید که چی بشه؟ تبدیل یک متن یونیکد به ANSI باعث میشه که یا اون متن رو از دست بدید، یا اینکه متن شما وابسته به CodePage فعال ANSI بشه. شما اگر بخواید اون متن رو به ANSI تبدیل کنید، اگر میخواید متن از بین نره، باید CodePage فعال سیستم تون هم فارسی باشه. در اون صورت، کارکترها در هنگام تبدیل به کارکترهای ANSI معادل خودشون به درستی Map میشند، اما اون داده رو هر جا ببرید، اگر CodePage فعال سیستم فارسی نباشه، به جای متن فارسی، یک سری کارکترهای نامفهوم دریافت می کنید.

اگر هدفتون ذخیره کردن در بانک Access هست، Access در هر حال کارکترها رو به صورت یونیکد ذخیره میکنه، پس تبدیل کارکترها از utf8 به ANSI و سپس ذخیره در Access میشه utf8 به ANSI به utf16، یعنی سربار اضافی.

در هر حال، اگر خیلی اصرار دارید که این کار رو انجام بدید، دلفی 7 دو تابع Utf8Encode و Utf8Decode رو در اختیارتون میزاره. می تونید فایل رو به صورت عادی در یک StringList یا Memo لود کنید، و نهایتا متن موجود رو با استفاده از Utf8Decode، از UTF-8 به ANSI تبدیل کنید. دو تابع فوق در واقع از توابع MultiByteToWideChar (http://msdn.microsoft.com/en-us/library/dd319072%28VS.85%29.aspx) و WideCharToMultiByte (http://msdn.microsoft.com/en-us/library/dd374130%28v=VS.85%29.aspx) ویندوز برای این کار استفاده می کنند.