AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Konvertierung der Umlaute einer Dosdatei im Tmemo
Thema durchsuchen
Ansicht
Themen-Optionen

Konvertierung der Umlaute einer Dosdatei im Tmemo

Ein Thema von joehd · begonnen am 13. Aug 2023 · letzter Beitrag vom 16. Aug 2023
Antwort Antwort
joehd

Registriert seit: 8. Okt 2008
Ort: Heidelberg
110 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 13. Aug 2023, 23:13
Hier mal die Beschreibung von Embarcadero

TEncoding (Delphi)
Description

This example determines the encoding of a source file and then writes the file in any encoding chosen. Use this project to create files of any encoding. This example requires two text edits and a combo box.
Code

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  LBuffer: TBytes;
  LByteOrderMark: TBytes;
  LOffset: Integer;
  LEncoding, DestEncoding: TEncoding;
  LFileStream: TFileStream;
  EncodingArray: array[0..5] of TEncoding;
begin
  LEncoding:= nil;
  EncodingArray[0]:= TEncoding.UTF8;
  EncodingArray[1]:= TEncoding.UTF7;
  EncodingArray[2]:= TEncoding.Unicode;
  EncodingArray[3]:= TEncoding.Default;
  EncodingArray[4]:= TEncoding.BigEndianUnicode;
  EncodingArray[5]:= TEncoding.ASCII;
  DestEncoding := EncodingArray[ComboBox1.ItemIndex];
  LFileStream := TFileStream.Create(Edit1.Text, fmOpenRead);
  try
    // Read file into buffer.
    SetLength(LBuffer, LFileStream.Size);
// LFileStream.Read(LBuffer[0], Length(LBuffer));
    LFileStream.ReadBuffer(Pointer(LBuffer)^, Length(LBuffer));

    // Identify encoding and convert buffer to UTF8.
    LOffset := TEncoding.GetBufferEncoding(LBuffer, LEncoding);
// for I := 0 to Length(LBuffer) - 1 do
// Memo1.Lines.Add((LBuffer[I]));
    LBuffer := LEncoding.Convert(LEncoding, DestEncoding, LBuffer,
      LOffset, Length(LBuffer) - LOffset);
  finally
    LFileStream.Free;
  end;

  LFileStream := TFileStream.Create(Edit2.Text, fmCreate);
  try
    // Write an encoding byte-order mark and buffer to output file.
    LByteOrderMark := DestEncoding.GetPreamble;
    LFileStream.Write(LByteOrderMark[0], Length(LByteOrderMark));
    LFileStream.Write(LBuffer[0], Length(LBuffer));
  finally
    LFileStream.Free;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   with ComboBox1, Items do begin
     Add('TEncoding.UTF8');
     Add('TEncoding.UTF7');
     Add('TEncoding.Unicode');
     Add('TEncoding.Default');
     Add('TEncoding.BigEndianUnicode');
     Add('TEncoding.ASCII');
     ItemIndex := 0;
  end;
end;
joe
immer wenn ich was suche finde ich es hier komisch oder ?
Arbeite mit D3 D5 D2007 DXE Prof
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.633 Beiträge
 
Delphi 12 Athens
 
#2

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 13. Aug 2023, 23:47
Wenn es unter DOS mit dem im Deutschen üblichen OEM-Zeichensatz codiert ist, dann kannst du dir ein passendes Encoding selbst erstellen: myEncoding := TMBCSEncoding.Create(850);
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 14. Aug 2023, 04:58
Um Deine Datei im Memo darzustellen, ohne viel schnickschnack:
Delphi-Quellcode:
procedure ReadFileIntoMemo(const AFilename: string; const AMemo: TMemo);
var
  Reader: TStreamReader;
  Line: string;
begin
  Reader := TStreamReader.Create(AFilename, TEncoding.ANSI);
  try
    AMemo.Lines.BeginUpdate;
    AMemo.Clear;

    AMemo.Font.Name := 'Terminal';
    AMemo.Font.Size := 9;
    AMemo.Font.Charset := OEM_CHARSET;
    AMemo.Font.Style := [];

    while not Reader.EndOfStream do
    begin
      Line := Reader.ReadLine;
      AMemo.Lines.Add(Line);
    end;
    AMemo.Lines.EndUpdate;
  finally
    Reader.Free;
  end;
end;
Angehängte Grafiken
Dateityp: png Bild_2023-08-14_055800434.png (459 Bytes, 17x aufgerufen)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.352 Beiträge
 
Delphi 12 Athens
 
#4

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 14. Aug 2023, 09:35
Njain, Fonts ala Terminal und Consolas und haben nichts mit Codepages und Co. zu tun.

OK, das Font.Charset schon, aber hat das seit Unicode (Delphi 2009) noch eine Wirkung?



Beziehen sie sich nicht nur auf einen 8-Bit-ANSI-String, oder wie?
https://learn.microsoft.com/en-us/wi...character-sets
Fand jetzt nur was zum Lesen, aber nichts zum Zuweisen
https://learn.microsoft.com/en-us/wi...gettextcharset
https://learn.microsoft.com/en-us/wi...extcharsetinfo
und im TFont.SetCharset hab ich mich im Fontmanager verloren und sehe nirgends, dass damit auch was gemacht wird.



Obwohl, das Wiki sagt
https://docwiki.embarcadero.com/Libr....TFont.Charset
hmmmmmmmmmmmmmmm......?



[add]
Ob mit CharSet oder ohne, ich sehe keinen Unterschied.
Delphi-Quellcode:
procedure TForm25.FormCreate(Sender: TObject);
begin Memo1.Text := 'a'#$84'b'#$0084'c';
  Memo1.Font.Name := 'Terminal';
// Memo1.Font.Charset := OEM_CHARSET;
  Memo1.Font.Size := 20;
end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (14. Aug 2023 um 10:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.633 Beiträge
 
Delphi 12 Athens
 
#5

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 14. Aug 2023, 10:16
Da der Reader mit TEncoding.Ansi erzeugt wurde, erfolgt die fehlerhafte Umwandlung in Unicode bereits im Reader.Readline , weil die Datei ja gerade eben nicht Ansi-codiert ist. Danach ist das kaum noch in den Griff zu bekommen. Mit dem von mir weiter oben beschriebenen Encoding sollte das aber funktionieren.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 14. Aug 2023, 12:06
Zweiter Versuch ohne viel schnick-schnack:
Delphi-Quellcode:
procedure ReadFileToMemo(const AFilename: string; const AMemo: TMemo; const ACodePage: Integer = 850);
var
  Reader: TStreamReader;
  Encoding: TEncoding;
  Line: string;
begin
  Encoding := TEncoding.GetEncoding(ACodePage);
  try
    Reader := TStreamReader.Create(AFilename, Encoding);
    try
      AMemo.Lines.BeginUpdate;
      AMemo.Clear;
      while not Reader.EndOfStream do
      begin
        Line := Reader.ReadLine;
        AMemo.Lines.Add(Line);
      end;
      AMemo.Lines.EndUpdate;
    finally
      Reader.Free;
    end;
  finally
    Encoding.Free;
  end;
end;
// hab noch ein argument zum easy wechseln hinzugefügt
Dies sollte dem Beispiel von Uwe schon recht nahe kommen.
Angehängte Grafiken
Dateityp: png Bild_2023-08-14_130557237.png (1,1 KB, 9x aufgerufen)
Gruß vom KodeZwerg

Geändert von KodeZwerg (14. Aug 2023 um 12:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.633 Beiträge
 
Delphi 12 Athens
 
#7

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 14. Aug 2023, 13:26
Dies sollte dem Beispiel von Uwe schon recht nahe kommen.
In der Tat tut GetEncoding auch nichts anderes, solange die übergebene Codepage keinem der im case angegebenen Sonderfälle entspricht.

Allerdings könnte man es ja auch mal mit einem simplem AMemo.LoadFromFile(AFileName, Encoding); versuchen - so wegen ohne viel schnick-schnack...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
joehd

Registriert seit: 8. Okt 2008
Ort: Heidelberg
110 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 14. Aug 2023, 19:57
Hallo
Danke erstmal das mit dem Encoding hat top funktioniert.
Das bedeutet nicht das das andere nicht funktioniert hätte aber es war auch einfach ...
Ich wusste bis heute nicht das es Encoding gibt und ich habe schon viele Tmemo geladen Danke !!
Guter Tip
Danke !!!!

Hier der Code für andere ...


Delphi-Quellcode:
var x,y: Integer;
    FilenameS,FilenameD : String;
    myEncoding : Tencoding; // myEncoding := TMBCSEncoding.Create(850);

Begin
  myEncoding := TMBCSEncoding.Create(850); // hier gibt es auch andere Siehe das Embarcadero WICKI weiter vorne
  // diverses for dem Laden des Files

  // old // form1.GDT_TEMP.Lines.LoadFromFile(Filenames); // bei While immer auf 0 setzen

 form1.GDT_TEMP.Lines.LoadFromFile(Filenames,myEncoding); // bei While immer auf 0 setzen

  // tu dann was mit dem Memo Inhalt

end;
joe
immer wenn ich was suche finde ich es hier komisch oder ?
Arbeite mit D3 D5 D2007 DXE Prof

Geändert von joehd (14. Aug 2023 um 20:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.352 Beiträge
 
Delphi 12 Athens
 
#9

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 14. Aug 2023, 20:08
selbst-erstellte TEncoding freigeben (Free)

nur die 5 Standard-Encodings, welche aus gewissen Property/Methoden raus kommen ... die nicht freigeben.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (14. Aug 2023 um 20:15 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz