PDA

View Full Version : ایجاد فایل با فرمت یونیکد



SQLMAN
یک شنبه 16 فروردین 1388, 15:35 عصر
با عرض سلام و تبریک سال نو به همه دوستان عزیز
در دلفی 7 با تعریف متغیر از نوع txtFile
میتونیم فایل بافرمت Ansi
ایجاد کرده و ذخیره کنیم،سوال من این هست که چطور می تونیم فایل را به فرمت دیگری مثلا یونیکد ذخیره کنیم؟
اصلا چطور خصوصیات فایل را در برنامه تعیین کنیم؟

ممنون

vcldeveloper
دوشنبه 17 فروردین 1388, 01:01 صبح
دلفی 7 به خودی خود از یونیکد پشتیبانی نمیکنه. برای این کار می تونید از کامپوننت های TNT که یونیکد را پشتیبانی می کنند، استفاده کنید. در این کامپوننت ها یک کلاس string list با قابلیت پشتیبانی از یونیکد پیدا می کنید که می تونید باهاش یونیکد ذخیره کنید.
یونیکد در دلفی 2009 بدون نیاز به کامپوننت پشتیبانی میشه.

SQLMAN
شنبه 29 فروردین 1388, 09:50 صبح
من یه فایل خالی با فرمت یونیکد روی هارد ایجاد می کنم ،بعد داخل برنامه یه کپی از اون ایجاد کرده و اطلاعات را داخلش پر می کنم،
اما فایل که ایجاد شده بازم فرمتش ANSI هست!!
آیا دلیلش بازم همینه؟؟
دلفی 7 به خودی خود از یونیکد پشتیبانی نمیکنه.

vcldeveloper
شنبه 29 فروردین 1388, 10:11 صبح
آیا دلیلش بازم همینه؟؟
بله. اون چیزی که یونیکد بودن یا نبودن یک فایل متنی را مشخص میکنه، محتوای آن هست. شما اگر یک فایل یونیکد داشته باشید، و محتوای ANSI در آن قرار بدید، دیگه فایل یونیکد نیست.
string در دلفی 7 متن را بصورت ANSI نگهداری میکنه. شما اگر یک متن یونیکد را به string در دلفی 7 اختصاص بدید، کدهای یونیکد آن از بین میرند. در دلفی 7 نوع داده WideString برای نگهداری رشته های یونیکد استفاده میشه، البته کارایی کمتری از string داره، و در VCL هم از آن استفاده نمیشه؛ یعنی اگر فرضا یک فایل متنی یونیکد را در یک Memo لود کنید، و بعد آن را به یک WideString اختصاص بدید، داده ها از بین میرند، چون Memo داده ها را بصورت string نگهداری میکنه، و string هم ANSI هست. برای همین هم هست که در دلفی 7 از کامپوننت های TNT برای پشتیبانی از یونیکد استفاده میشه.

درباره دلفی 2009 هم که قبلا توضیح دادم؛ نوع داده string در دلفی 2009 بطور پیش فرض یونیکد هست، و نیازی به استفاده از WideString یا کامپوننت برای پشتیبانی از یونیکد نیست. در دلفی 2009 هر متنی که استفاده می کنید بطور پیش فرض یونیکد هست، مگر اینکه خودتون بهش بگید یونیکد نباشه.

SQLMAN
شنبه 29 فروردین 1388, 16:19 عصر
من مجموعه کامپوننت TNT را نصب کردم،حالا میشه راهنمایی بفرمایید برای ایجاد فایل چه کار کنم؟

vcldeveloper
شنبه 29 فروردین 1388, 18:46 عصر
من مجموعه کامپوننت TNT را نصب کردم،حالا میشه راهنمایی بفرمایید برای ایجاد فایل چه کار کنم؟ بجای TStringList، از TTntStringList استفاده کنید:


uses TntClasses;

...
var
S : TTntStringList;
begin
S := TTntStringList.Create;
try
S.Add('Some text');
S.SaveToFile('C:\Test.txt');
finally
S.Free;
end;
end;
می تونید از کنترل های TNT مثل TntMemo، TntRichEdit، و غیره هم استفاده کنید. دقت کنید که در طول مدتی که با داده های متنی یونیکد در برنامه کار می کنید، هیچ کجا نباید این داده را به متغیری از نوع string اختصاص بدید، یا از توابعی که string بر میگردانند بر روی آنها استفاده کنید. اگر داده یونیکدیی در دلفی 7 به string اختصاص پیدا کنه، از بین میره!

ghabil
یک شنبه 30 فروردین 1388, 02:12 صبح
میتونی یک TMemoryStream بگیری بعد توش WideChar بنویسی بعد هم سیوش بکنی :

این کد رو از تو اینترنت سرچ کردم و تست هم نکردم ولی بنظر میاد کد کامل و خوبی باشه:



Procedure SaveStringsAsUnicode( const thefilename:String;
theStringlist: TStrings );
Var
WS: WideString;
fs: TFileStream;
byteorder_marker: Word;
Begin
WS:= theStringList.Text;
fs:= Tfilestream.create( thefilename, fmCreate );
try
byteorder_marker := $FEFF;
fs.WriteBUffer( byteorder_marker, sizeof(byteorder_marker));
fs.WriteBuffer( WS[1], Length(WS)*Sizeof( WS[1] ));

{
You should check whether WS <> '', otherwise your little
source will throw out an exception if WS = ''. Or use
PWideChar(WS)^ instead of WS[1].
}
finally
fs.free
end;
End;

SQLMAN
دوشنبه 31 فروردین 1388, 15:45 عصر
این کد رو از تو اینترنت سرچ کردم و تست هم نکردم ولی بنظر میاد کد کامل و خوبی باشه:

من تست کردم جواب داد مرسی:لبخندساده:
از راهنمایی آقای کشاورز هم ممنونم

mohsen24000
پنج شنبه 01 اردیبهشت 1390, 16:13 عصر
سوال: چرا وقتی که فایل ایجاد شده را در tntmemo یا tntRichEdit و یا Tmemo خود دلفی با دستور Lines.LoadfromFile فراخوانی می کنیم جز چند کاراکتر مبهم ، متن را درست نمایش نمی دهد!؟
در ضمن دلفی 7 (یونیکد رو ساپورت نمیکنه) پس چرا کامپوننت TNT هم نمایش نمیدهد!؟
باتشکر

vcldeveloper
پنج شنبه 01 اردیبهشت 1390, 17:57 عصر
چرا وقتی که فایل ایجاد شده را در tntmemo یا tntRichEdit و یا Tmemo خود دلفی با دستور Lines.LoadfromFile فراخوانی می کنیم جز چند کاراکتر مبهم ، متن را درست نمایش نمی دهد!؟
فایل ایجاد شده چی هست؟ چه Encoding ایی داره؟ در دلفی 7، کلاس TMemo فقط با ANSI کار میکنه. مجموعه TNT هم با UTF-16 LE کار میکنه. پس اگه فایل با Encoding دیگه ایی کد شده باشه، با اینها به درستی نمایش داده نمیشه.

mohsen24000
پنج شنبه 01 اردیبهشت 1390, 21:06 عصر
علی جان باهمین کدهای پست هفت همین تاپیک فایل یونیکد ساختم و در notpad ویندوز ، هم نمایش میده و هم فرمتش رو یونیکد اعلام میکنه ولی وقتی همین فایل رو با کامپوننتهای تی ان تی لود میکنم جز چند کاراکتر بی ربط چیز دیگه ای نمایش نمیده!
خب اگه TNT یونیکد رو ساپورت میکنه پس چرا مشکل هست!؟

نمیدونم بعد از این که دوباره برنامه رو کامپایل کردم مشکلش حل شد و فایل ضمیمه را نمایش داد!

جالبه وقتی عبارت تبدیل شده به یونیکد در پست 7 را بجای نوشتن در فایل ، اون رو در یک TmemoryStream میریزم در ویندوزی که non-unicode اون فارسی نیست ، قالب یونیکد میشه ولی همه کاراکترها تبدیل به علامت سوال میشه ولی در ویندوزی که non-unicode فارسی تعریف شده تبدیل درست انجام میشه!
با این تفاسیر بفرمایید برای رفع این نقیصه راه مشخصی وجود داره!؟
اگه راهنمایی بفرمایید ممنون میشم.
باتشکر

tdkhakpur
جمعه 02 اردیبهشت 1390, 20:45 عصر
ویندوزی که non-unicode اون فارسی نیست ، قالب یونیکد میشه ولی همه کاراکترها تبدیل به علامت سوال میشه ولی در ویندوزی که non-unicode فارسی تعریف شده تبدیل درست انجام میشه!
با این تفاسیر بفرمایید برای رفع این نقیصه راه مشخصی وجود داره!؟


برای اینکه حروف فارسی به درستی نشان داده بشه حتما باید درایور فارسی روی سیستم نصب باشه بدون اون با یونیکد هم نمیتونید اپن مشکل رو برطرف کنید.
اما در مورد اینکه چرا حروف بی ربط نشان میده - این میتونه به نوع فونت انتخابی برای کنترل مربوط باشه .

mohsen24000
شنبه 03 اردیبهشت 1390, 07:49 صبح
برای اینکه حروف فارسی به درستی نشان داده بشه حتما باید درایور فارسی روی سیستم نصب باشه
ممنون
فارسی روش نصبه ، فقط زبان non-unicode رو انگلیسی گذاشتم. و در تایپ فارسی مشکلی نداره.

vcldeveloper
شنبه 03 اردیبهشت 1390, 12:52 عصر
فارسی روش نصبه ، فقط زبان non-unicode رو انگلیسی گذاشتم. و در تایپ فارسی مشکلی نداره.
من اون فایل یونیکد شما رو با TntMemo در یک سیستم ویندوز 7 و یک سیستم ویندوز XP بدون تنظیم Non-Unicode Language بر روی فارسی، با فونت Tahoma ویندوز، تست کردم، و در همه موارد متن رو درست نمایش داد.

mohsen24000
شنبه 03 اردیبهشت 1390, 14:26 عصر
نمیدونم بعد از این که دوباره برنامه رو کامپایل کردم مشکلش حل شد و فایل ضمیمه را نمایش داد!
ممنون از لطفتون
بنده هم عرض کردم اون مورد درست شد...
لکن سوالی که دارم برای اینکه من متن یونیکد شده داخل TMemoryStream رو داخل یک فیلد TEXT در SQLite که یونیکد رو ساپورت میکنه چه کار کنم!؟
نتیجتا باید در دلفی 7 که یونیکد رو پشتیبانی نمیکنه در یک متغیر WideString بریزم بعد به بانک اضافه کنم Fieldbyname('context').asstring:=ws...
برای این تبدیل از مموری استریم به واید استرینگ چه راه کاری رو پیشنهاد میفرمایید!:خجالت:

vcldeveloper
شنبه 03 اردیبهشت 1390, 14:52 عصر
لکن سوالی که دارم برای اینکه من متن یونیکد شده داخل TMemoryStream رو داخل یک فیلد TEXT در SQLite که یونیکد رو ساپورت میکنه چه کار کنم!؟
اگه SQLite از یونیکد پشتیبانی میکنه، فیلد بانک اطلاعاتی ساخته شده در دلفی از نوع TWideStringField خواهد بود، پس مشکلی برای استفاده از اون فیلد نخواهید داشت، فقط در هنگام نمایش محتوای آن، باید از کنترل های TNT استفاده کنید، و مقدار اون فیلد رو هم در برنامه، جایی به یک متغیر string اختصاص ندید، بلکه همیشه از WideString استفاده کنید.

mohsen24000
شنبه 03 اردیبهشت 1390, 16:41 عصر
var ms:TmemoryStream;
ws:WideString;

SetString(ws,pwchar( Ms.Memory), Ms.Size div SizeOf(wChar));

با این کد TmemoryStream رو به WideString تبدیل کردم...
و با TNT هم تست کردم درست جواب داد...