मैं डेल्फी में यूनिकोड टेक्स्ट फ़ाइल कैसे लिख सकता हूं?

वर्तमान में मैं केवल AssignFile, RewriteFile, और Writeln का उपयोग करता हूं, लेकिन यह यूनिकोड वर्ण नहीं लिखता है।

0
Wolfgang Bures 29 नवम्बर 2020, 00:56
1
आप डेल्फी के आधुनिक संस्करणों में 1980 फ़ाइल I/O का उपयोग क्यों कर रहे हैं? इसके बजाय TFileStream का प्रयोग करें। यह अब 2 दशकों से अधिक समय से अस्तित्व में है। आप फ़ाइल I/O का उपयोग कर रहे हैं जो Turbo Pascal 1 से है। यहां तक ​​कि TStringList.SaveToFile का उपयोग करना टेक्स्ट फ़ाइलों के साथ व्यवहार करते समय बेहतर होगा।
 – 
Ken White
29 नवम्बर 2020, 01:01
2
या इससे भी बेहतर, इसके बजाय TStreamWriter का उपयोग करें।
 – 
Remy Lebeau
29 नवम्बर 2020, 01:16

2 जवाब

सबसे बढ़िया उत्तर

आपको पुराने पास्कल I/O का बिल्कुल भी उपयोग नहीं करना चाहिए। इसने 80 के दशक में अपना काम किया था लेकिन आज बहुत अप्रचलित है।


इस सदी में, आप TStringList का उपयोग कर सकते हैं। यह आमतौर पर डेल्फी में उपयोग किया जाता है। उदाहरण के लिए, वीसीएल नियंत्रण मेमो की टेक्स्ट की पंक्तियों और कॉम्बो बॉक्स या सूची बॉक्स के आइटम तक पहुंचने के लिए TStrings का उपयोग करता है।

var SL := TStringList.Create;
try
  SL.Add('∫cos(x)dx = sin(x) + C');
  SL.Add('¬(a ∧ b) ⇔ ¬a ∨ ¬b');
  SL.SaveToFile(FileName, TEncoding.UTF8);
finally
  SL.Free;
end;

अधिक उन्नत आवश्यकताओं के लिए, आप एक TStreamWriter का उपयोग कर सकते हैं:

var SW := TStreamWriter.Create(FileName, False, TEncoding.UTF8);
try
  SW.WriteLine('αβγδε');
  SW.WriteLine('ωφψξη');
finally
  SW.Free;
end;

और बहुत ही साधारण जरूरतों के लिए, नए TFile हैं। IOUtils.pas में तरीके:

var S := '⌬ is aromatic.';
TFile.WriteAllText(FileName, S, TEncoding.UTF8);         // string (possibly with linebreaks)

var Lines: TArray<string>;
Lines := ['☃ is cold.', '☼ is hot.'];
TFile.WriteAllLines(FileName, Lines, TEncoding.UTF8);    // string array

जैसा कि आप देख सकते हैं, ये सभी आधुनिक विकल्प आपको UTF8 को एन्कोडिंग के रूप में निर्दिष्ट करने की अनुमति देते हैं। यदि आप UTF16 जैसे किसी अन्य एन्कोडिंग का उपयोग करना पसंद करते हैं, तो यह भी ठीक है।


बस AssignFile, Reset, Rewrite, Append, CloseFile आदि के बारे में भूल जाएं।

7
Andreas Rejbrand 29 नवम्बर 2020, 02:49

अन्य उपयोगकर्ताओं ने आपको विकल्प दिए हैं लेकिन किसी ने उत्तर नहीं दिया है (मुझे लगता है)। आप Writeln का उपयोग करके UTF8 नहीं लिख सकते क्योंकि रनटाइम पर, किसी भी स्ट्रिंग को Ansi पर वापस स्विच किया जाता है। हालांकि सभी प्रस्ताव बहुत अच्छे लगते हैं।

इस संक्षिप्त कार्यक्रम को आजमाएं

program utf8;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var s : string; u : AnsiString;   some : Text;

begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
    Assign(some,'data.txt');
    rewrite(some);
    s := 'física';
    u := UTF8Encode (s);
    writeln(some,s);
    writeln(some,u);
    Close(some);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

"डीबग डीसीयू का उपयोग करें" सक्षम करें और Writeln निष्पादन का ध्यानपूर्वक पालन करें। आप सीखेंगे कि UTF8 एन्कोडेड होने के बावजूद, u किसी बिंदु पर वापस Ansi में बदल जाता है।

संस्करण: मैं गलत था। आप वास्तव में इसके साथ कर सकते हैं:

Assign(FileName,CP_UTF8);

System.Assign के लिए सहायता देखें

1
alvaroc 13 सितंबर 2021, 23:18