2016-04-18 8 views
1

Ich benutze Delphi 7, Wie kann ich ein Memo als Unicode-Textdatei speichern, finde ich ein Beispiel für das Speichern als UTF-8-Textdatei, aber ich brauche ein Beispiel zum Speichern der Datei als Unicode. Danke für jede HilfeSo speichern Sie ein Memo als Unicode

Antwort

4

Sie müssen ein Steuerelement verwenden, das Unicode unterstützt. Delphi 7 TMemo nicht. Das bedeutet, dass dein wirkliches Problem nicht so sehr darin besteht, den Inhalt zu retten, sondern den Inhalt überhaupt erst zuzulassen.

Sie sollten damit umgehen, indem Sie zu den TNT Unicode-Komponenten wechseln. Sobald Sie die TNT Unicode components verwenden, unterstützt das TNT Unicode-Memo das Speichern der Inhalte als Unicode.

2

UTF-8ist Unicode. Es ist nur ein Byte-Kodierungsschema für Unicode-Daten. Wenn Sie wirklich meinen, dass Sie die Datei als UTF-16 anstelle von UTF-8 speichern müssen, ist das eine andere Frage.

Die beste Option besteht darin, ein Unicode-basiertes Memo-Steuerelement zu verwenden, damit es die Unicode-Daten für Sie verarbeiten kann. Sie sollten wirklich auf eine moderne Unicode-basierte Delphi-Version (Delphi 2009 oder höher) upgraden und Unicode-Konvertierungen für Sie durchführen lassen. Wenn Sie bei einer alten ANSI-basierten Delphi-Version (Delphi 2007 oder früher) bleiben, sollten Sie, wie von David vorgeschlagen, Unicode-UI-Steuerelemente von Drittanbietern verwenden.

Wenn Sie jedoch mit dem nativen VCL ANSI-basierten Memo bleiben, können Sie immer noch erreichen, was Sie verlangen, Sie müssen die Konvertierung nur manuell in Ihrem Code verwalten. Sie können die TMemo ANSI-basierten Daten in UTF-16 konvertieren, indem Sie den Zeichenfolientyp WideString verwenden (der intern MultiByteToWideChar() verwendet, um ANSI-Daten in UTF-16 zu konvertieren) und dann die UTF-16-Daten in eine Datei schreiben.

Zum Beispiel:

var 
    BOM: WideChar; 
    FS: TFileStream; 
    WS: WideString; 
    I: Integer; 
begin 
    FS := TFileStream.Create('MyUnicodeFile.txt', fmCreate); 
    try 
    BOM := $FEFF; 
    FS.WriteBuffer(BOM, SizeOf(BOM)); 
    For I := 0 to Memo1.Lines.Count-1 do 
    begin 
     WS := WideString(Memo1.Lines[I] + sLineBreak); 
     FS.WriteBuffer(PWideChar(WS)^, Length(LS) * SizeOf(WideChar)); 
    end; 
    finally 
    FS.Free; 
    end; 
end;