Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Unicode in datei schreiben (https://www.delphipraxis.net/69573-unicode-datei-schreiben.html)

remie 17. Mai 2006 09:56


Unicode in datei schreiben
 
Hi leute

ich muss so ziemlich jede sprache die es Gibt mit ihren Zeichen in eine Datenbank schreiben können,
die Datenbank ( Mysql ) kann ja utf-8 ohne Probleme aber Delphi kann es ja nicht so einfach.
da habe ich hier im Forum die "TntUnicodeControls" gefunden.

Wenn ich jetzt hingehe und an meinem Rechner das Eingabeschema auf Koreanisch stelle, kann ich auch wunderbar denen ihre Zeichen tippen. zum Testen ob das alles klappt wolle ich das eingegebene mal in eine Datei schreiben.
Wenn ich die dann aber die Datei schreibe und danach wieder auslesen will kommen nur . raus.

Code:
procedure TForm1.Button2Click(Sender: TObject);
var f    : System.text;
    daten : WideString;
    i    : Integer;
begin
  SaveDialog1.Execute;

  if NOT fileexists(SaveDialog1.FileName) then begin
    IF NOT fileexists(SaveDialog1.FileName) THEN BEGIN
      SYSTEM.ASSIGN(f,SaveDialog1.FileName);
      SYSTEM.REWRITE(f,SaveDialog1.FileName);
      SYSTEM.CLOSE(f);
    END;
    SYSTEM.ASSIGN(f,SaveDialog1.FileName);
    SYSTEM.APPEND(f);
    for i:=0 to tntedit1.Lines.Count-1 do begin
      WRITELN(f,tntedit1.Lines.ValueFromIndex[i]);
    end;
    SYSTEM.CLOSE(f);
  end;
end;
das is der Button der die Datei schreibt. muss ich da noch irgendwas setzen oder so ?

Danke mal für die Hilfe

Luckie 17. Mai 2006 09:57

Re: Unicode in datei schreiben
 
Versuch es mal mit einem FileStream anstatt mit den veralteten Pascal Routinen.

remie 17. Mai 2006 09:59

Re: Unicode in datei schreiben
 
wie meinen ?

Luckie 17. Mai 2006 10:00

Re: Unicode in datei schreiben
 
Delphihilfe Delphi-Referenz durchsuchenTFileStream.

sh17 17. Mai 2006 10:03

Re: Unicode in datei schreiben
 
Und bei Dir dann speziell TTntFileStream oder TTntStringList

himitsu 17. Mai 2006 10:06

Re: Unicode in datei schreiben
 
TextFile ist nicht Unicodetauglich ... hatte ich vor ein paar Tagen hier schonmal irgendwo gesagt.
das Read/Write/ReadLn/WriteLn nimmt Zwar WideStrings ntgegen, aber intern werden die in AnsiStrings umgewandelt und auch "nur" als ANSI in die Datei geschrieben, oder daraus gelesen.

remie 17. Mai 2006 10:18

Re: Unicode in datei schreiben
 
hm naja ok dan is mir klar warum es nicht gegangen ist.

aber jetzt hätte ich noch ne kurze frage zum verständnis:
procedure WriteBuffer(const Buffer; Count: Longint);
damit schreibe ich ja in dateien ... der buffer ist dan mein WideString aus dem TntRitchEdit oder ?
und was muss ich bei dem count mitgeben, wieviele Zeichen das sind oder Bits oder ...
das is mir noch nicht so ganz klar

sh17 17. Mai 2006 10:23

Re: Unicode in datei schreiben
 
bei WideString ist Count = Length * 2

remie 17. Mai 2006 10:28

Re: Unicode in datei schreiben
 
und was sollte ich dan da beim lesen ( REadBuffer) angeben ? da habe ich die Zeilenlänge ja nicht :gruebel:

himitsu 17. Mai 2006 10:41

Re: Unicode in datei schreiben
 
Entweder du ließt solange ein, bis du ein #0, #13, oder #10 findest (ReadLn macht das nicht anders),
oder du speicherst dir die Länge mit ab (z.B. einen Integer davor speichern, wo die Länge des nachvolgenden Strings drinsteht)

remie 17. Mai 2006 10:58

Re: Unicode in datei schreiben
 
so ich glaub ich hab mal wieder ein bischen geshcummelt aberegal habe es so probiert

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  daten : WideString;
  datei : TTntFileStream;
begin
  openDialog1.Execute;
  if fileexists(opendialog1.FileName) then begin
    datei :=TTntFileStream.Create(opendialog1.FileName,fmOpenRead);
    datei.ReadBuffer(daten,datei.Size);
    Memo1.Lines.Add(daten);
    TNTEdit1.Lines.Add(daten);
    datei.free
  end else ShowMessage('ERROR FILE NOT EXIST')
end;
aber das schint nicht so ganz zu klappen den er schreibt mir in die memos nix rein :gruebel:
aber imprinzip müsste es doch gehen wenn ich das ganze file einlesen will oder ?

sh17 17. Mai 2006 11:08

Re: Unicode in datei schreiben
 
du müsstest vorher die Länge des Strings daten mit SetLength setzen

aber wieso nimmst Du nicht TTntMemo.Lines.LoadFromFile?

bzw. TTntStringList.loadfromfile, wenn es eine Textdatei ist?

sh17 17. Mai 2006 11:10

Re: Unicode in datei schreiben
 
ausserdem, solltest Du koreanisch als Sprache nutzen, dann solltest Du auch alle anderen Funktionen durch WideString-Funktionen ersetzen: z.B. FileExists -> WideFileExists

himitsu 17. Mai 2006 11:12

Re: Unicode in datei schreiben
 
Ersten: das Memo kann auch nur ANSI, aber egal, es sollten dann zumindesntens etwas dinstehen.

Zweitens: UTF-8 kannst du doch auch per ANSI einlesen, es ist ja eine MultiByteCodierung, wo ja ein Einbytestring ausreichend ist.
im Delphi kannst du dann ja as UTF8 (in dem AnsiString) nach Unicode (in 'nem WideString) umcodieren lassen.

und Zuletzt: keine Ahnung warum's nicht geht (verwende keine FileStreams ._.)

[add]
Delphi-Quellcode:
datei :=TTntFileStream.Create(opendialog1.FileName,fmOpenRead);
SetLength(daten, datei.Size div 2)
datei.ReadBuffer(daten[1], datei.Size and not $1); // damit notfalls kein halbes Byte eingelesen wird
Zitat:

Zitat von sh17
dann solltest Du auch alle anderen Funktionen durch WideString-Funktionen ersetzen: z.B. FileExists -> WideFileExists

Das ist ja wohl vollkommen egal, wenn nur der Dateiinhalt Unicode ist :zwinker:

sh17 17. Mai 2006 11:16

Re: Unicode in datei schreiben
 
Zitat:

Zitat von himitsu
und Zuletzt: keine Ahnung warum's nicht geht (verwende keine FileStreams ._.)

erstens, wie schon gesagt, der String ist ja leer, der SPeicher in der Größe des Streams muss also erst reserviert werden

zweitens müsste es heißen ReadBuffer(daten[1],datei.Size)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz