ورود

View Full Version : ذخیر فایل txt با فرمت Utf8



solook
یک شنبه 29 دی 1387, 13:21 عصر
با سلام به دوستان

با کد زیر یک متن انگلیسی رو میشه با فرمت Utf8 ذخیره کرد :


var
F:textfile;
begin
AssignFile(F,'C:\f.txt' );
Rewrite(F);
Writeln(F,#$EF+#$BB+#$BF);
Writeln(F,'Ali');
CloseFile(F);اما وقتی خواسته باشیم حروف فارسی باهاش ذخیره کنیم هیچی ذخیر نمیکنه
چیکارش کنم ؟

vcldeveloper
دوشنبه 30 دی 1387, 00:28 صبح
اون کد متن موجود را تبدیل به UTF-8 نمیکنه، بلکه فقط Preamble مربوط به UTF-8 را به ابتدای فایل اضافه میکنه، تا برنامه ایی که فایل را باز میکنه، با خواندن این Preamble متوجه بشه که Encoding متن UTF-8 هست.
در واقع متنی که شما با اون کد ذخیره کردید ANSI هست که سعی میکنه به برنامه ایی که آن را باز میکنه بگه که Encodingاش UTF-8 هست. علت اینکه برای متن های انگلیسی درست کار میکنه هم این هست که UTF-8 برای کارکترهای انگلیسی از همون کدهای ANSI استفاده میکنه، و یک بایت هم به هر یک از آنها اختصاص میده، پس تا زمانی که از کارکتر های متداول انگلیسی که در ANSI تعریف شدند، استفاده کنید، UTF-8 با ANSI فرقی نداره، ولی وقتی از کارکترهای غیر انگلیسی که در ANSI تعریف نشدند، استفاده می کنید، UTF-8 برای ذخیره آنها از دو بایت استفاده میکنه، و متن ذخیره شده دیگه ANSI نیست. به همین دلیل هم ناکارامدی کد شما در هنگام استفاده از متن انگلیسی نمایان نمیشه، ولی در هنگام استفاده از متن فارسی مشخص میشه.

اگر از دلفی 2009 استفاده می کنید، برای ذخیره متن با فرمت UTF-8 از UTF8String استفاده کنید. اگر از نسخه های قبل از دلفی 2009 استفاده می کنید، همین نوع داده UTF8String در آنها هم وجود داره، ولی عملا کار خاصی انجام نمیده و به نوع داده string ارجاع میده، یعنی فقط کارکترهای ANSI را درست ذخیره میکنه. بنابراین برای اینکه بتونید در نسخه های قبل از دلفی 2009 متنی را به درستی با فرمت UTF-8 ذخیره کنید، باید دنبال کدها یا کامپوننت هایی باشید که توابعی برای ذخیره متن با فرمت UTF-8 ارائه می کنند. دلفی خودش تا قبل از دلفی 2009 قابلیت خاصی برای این منظور ارائه نمیکنه.

vcldeveloper
سه شنبه 01 بهمن 1387, 01:48 صبح
امشب به طور اتفاقی متوجه شدم که به دلفی های نسخه 2005 به بالا یونیتی با نام WideStrUtils اضافه شده که درش تابعی با نام ConvertStringFromAnsiToUTF8 وجود داره که میتونه یک رشته ANSI را بصورت Stream بگیره، و معادل UTF-8 آن را در یک Stream دیگه برگردانه. پس اگر از نسخه های قبل از دلفی 2009 استفاده می کنید، همچنان امکان تبدیل متن ANSI به UTF-8 برای شما فراهم هست.

solook
سه شنبه 01 بهمن 1387, 11:02 صبح
اگر از دلفی 2009 استفاده می کنید، برای ذخیره متن با فرمت UTF-8 از UTF8String استفاده کنید.

از این روش استفاده کردم و بصورت utf8 ذخیر نمود اما وقتی می خوام باخود دلفی متن رو باز کنم خوب باز نمیکنه

solook
سه شنبه 01 بهمن 1387, 13:16 عصر
با این کد برای ذخیره Utf8 استفاده کردم خوب جواب داد :


Memo1.Lines.SaveToFile(SaveDialog.FileName, TEncoding.UTF8);

nassim_20
شنبه 19 بهمن 1387, 18:35 عصر
جناب solook عزیز
این کدی که شما استفاده کردید در دلفی 7 هم میشه استفاده کرد؟ اگر بله آیا یونیت خاصی باید اضافه شود؟
من استفاده کردم ارور داد
من می خواهم تن درون memo رو ذخیره کنم ولی بهم می ریزه اصلا ناخوانا ذخیره می کنه
البته برای richedit درست ذخیره میشه ولی برای memo اینطور نیست چرا؟
راه حل چیه؟

vcldeveloper
یک شنبه 20 بهمن 1387, 04:31 صبح
این کدی که شما استفاده کردید در دلفی 7 هم میشه استفاده کرد؟
خیر، کد موجود در پست شماره 5 مخصوص دلفی 2009 هست، و در نسخه های قبل از آن همچین قابلیتی که موقع فراخوانی SaveToFile بشه Encoding را هم مشخص کرد، وجود نداره.

شما اگر در دلفی 7 به یونیکد نیاز دارید، کامپوننت های TNT را نصب و استفاده کنید.

nassim_20
یک شنبه 20 بهمن 1387, 04:56 صبح
من از همین کامپوننتها هم که استفاده می کنم (TntMemo) بازهم در ذخیره سازی مشکل دارم
حتی داخل برنامه محتویات فارسی memo رو بخوبی نشون میده ولی وقتی کپی می کنم به tntmemo یا richedit مشکل داره ولی حالت بالعکسش مشکلی نداره؟!!!!!
من می خواهم اطلاعات memo رو ذخیره کنم راهی وجود نداره
و اینکه مجبورم از داخل memo ذخیره کنم این است که طبق برنامه ای که من نوشتم یکسری عملیات روی رشته انجام می شود نتیجه این رشته ابتدا داخل tntmemo نمایش می دهم ولی چون بدرستی نمایش نمی دهد همان محتویات tntmemo رو داخل memo نشون می دهم که مشکلی نداره
البته دیفالت ویندوز من انگلیسیه می تونه مشکل از اینجا باشه؟

vcldeveloper
یک شنبه 20 بهمن 1387, 17:20 عصر
بستگی داره. مثلا رشته ایی که استفاده کردید از چه نوعی هست؟ string هست؟ string در دلفی 7 قابلیت ذخیره متن یونیکد را ندارد، و باید از WideString استفاده کنید. توابعی هم که برای کار با اون داده استفاده می کنید، همگی باید از یونیکد پشتیبانی کنند. اگر در حین پردازش یک جا هم یکی از این توابع داده شما را به string تبدیل کند، داده های یونیکد از بین می رود.

nassim_20
یک شنبه 20 بهمن 1387, 18:29 عصر
آقای کشاورز از اینکه وقت گذاشتید و پاسخ من رو دادید ممنون هستم
ولی من رشته ام رو هم از WideString تعریف کردم ولی همچنان مشکل وجود داره
یک سوال:
اگر متن فارسی درون memo بخوبی نشون داده بشه آیا میشه گفت که از لحاظ یونیکد مشکلی نیست؟
پس چرا همون متن رو وقتی توی richedit نشون میدهم ناخوانا و با حروف مبهم نشون میده؟

vcldeveloper
دوشنبه 21 بهمن 1387, 01:01 صبح
اگر متن فارسی درون memo بخوبی نشون داده بشه آیا میشه گفت که از لحاظ یونیکد مشکلی نیست؟
خیر. اگر متن فارسی غیر یونیکد در ویندوزی که تنظیم non-unicode language آن بر روی زبان فارسی باشد، استفاده شود، درست نمایش داده می شود.


ولی من رشته ام رو هم از WideString تعریف کردم ولی همچنان مشکل وجود داره
یک نمونه کد بزارید که مشکل شما را نمایش بده + یک تصویر از متنی که بصورت بهم ریخته نمایش داده میشه.

nassim_20
دوشنبه 21 بهمن 1387, 11:40 صبح
آقای کشاورز کد خیلی ساده است من تنها محتویات memo رو داخل richedit می ریزم
RichEdit1.Text := Memo1.Text;



در مورد تصویر هم خواستم بگذارم ولی نمی دونم چرا آیکونهای بالای صفحه غیر فعال هستند و نمی تونم از هیچکدومشون استفاده کنم ضمیمه هم همینطور

vcldeveloper
دوشنبه 21 بهمن 1387, 17:03 عصر
آقای کشاورز کد خیلی ساده است من تنها محتویات memo رو داخل richedit می ریزم
RichEdit1.Text := Memo1.Text;

منظورم این بود که سورس یک نمونه پروژه را بزارید که ما با اجرای آن در سیستم خودمان، با مشکل شما مواجه بشیم.


ولی نمی دونم چرا آیکونهای بالای صفحه غیر فعال هستند و نمی تونم از هیچکدومشون استفاده کنم ضمیمه هم همینطور
برای من همه شون کار می کنند!

nassim_20
چهارشنبه 23 بهمن 1387, 08:05 صبح
اینهم سورس پروژه به همراه عکس
تنها کافی است در memo کلمه فارسی تایپ بشه روی دکمه کلیک بشه و ...

nassim_20
چهارشنبه 23 بهمن 1387, 18:20 عصر
دوستان اگه کسی برنامه رو گرفته لطفا تست کنه ببینه نتیجه شبیه به تصویر است یا خیر؟

vcldeveloper
پنج شنبه 24 بهمن 1387, 02:35 صبح
دوستان اگه کسی برنامه رو گرفته لطفا تست کنه ببینه نتیجه شبیه به تصویر است یا خیر؟
خیر، من نتونستم مشکل شما را بازتولید کنم، و روی سیستم من بدون مشکل کار کرد.

nassim_20
پنج شنبه 24 بهمن 1387, 12:51 عصر
آقای کشاورز به نظر شما مشکل من از چی می تونه باشه؟
من احتمال می دم از تنظیمات ویندوز باشه البته من یکبار پیش فرض ویندوزم رو هم فارسی کردم ولی مشکل برقرار بود به نظر شما تنظیمات دیگه ای می تونه دخیل باشه؟
می تونید کمی راهنماییم کنید
من تنها می خواهم برنامه ام روی سیستم خودم کار کنه چون تنها خروجی اش برایم مهم است و باید خروجی رو ارائه دهم

vcldeveloper
پنج شنبه 24 بهمن 1387, 16:14 عصر
من تنها می خواهم برنامه ام روی سیستم خودم کار کنه چون تنها خروجی اش برایم مهم است و باید خروجی رو ارائه دهم
در تنظیمات Regional Settings ویندوز، بررسی کنید که زبان فارسی برای Language for non-unicode programs در تب Advanced انتخاب شده باشه.