Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Konvertierung der Umlaute einer Dosdatei im Tmemo (https://www.delphipraxis.net/213535-konvertierung-der-umlaute-einer-dosdatei-im-tmemo.html)

joehd 13. Aug 2023 22:28

Konvertierung der Umlaute einer Dosdatei im Tmemo
 
Hallo !
also ich bin gerade an einem Programm welches DOS geschriebene Dateien einließt und verarbeitet.
Mein Problem ist das die Zeichensätze nicht stimmen und so die Umlaute nicht rüber kommen ...

Delphi-Quellcode:
  Result := StringReplace(p_sLine,chr($84),'ä',[rfReplaceAll]);
  Result := StringReplace(p_sLine,chr($94),'ö',[rfReplaceAll]);
  Result := StringReplace(p_sLine,chr($81),'ü',[rfReplaceAll]);
  Result := StringReplace(p_sLine,chr($8E),'Ä',[rfReplaceAll]);
  Result := StringReplace(p_sLine,chr($99),'Ö',[rfReplaceAll]);
  Result := StringReplace(p_sLine,chr($9A),'Ü',[rfReplaceAll]);
  Result := StringReplace(p_sLine,chr($E1),'ß',[rfReplaceAll]);
Bringt auch nix. Er findet die flaschen Codes nicht.
Im Original kommen folgende Zeichen „ Ž ” ™ š á das entspricht einem ä Ä ö Ö ü Ü ß.

Hat jemand eine Idee ? MIt einem HEXeditor habe ich schon geschaut es sollten die richtigen zeichen ersetzt werden. OEM Konvert bringt auch nix ...
Ich habe alles aber auch wirklich alles durchsucht nach einem TIP ..
Vielen Dank

himitsu 13. Aug 2023 22:43

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
 
Zitat:

MIt einem HEXeditor habe ich schon geschaut es sollten die richtigen zeichen ersetzt werden.
In der Datei vielleicht noch, bevor DU falsch es eingelesen und kaputt germacht hast. (natürlich fehlen hierzu sämtliche Infos von dir)
Rate mal wofür der Debugger ist ... damit kann man nachsehn, was in der Variable steckt,
aber auf einem anderen Rechner, mit anderer ANSI-Codepage, würde das dann auch nichts mehr helfen, da diese Werte nicht vor sodern nach der Konvertierung liegen.

Zitat:

OEM Konvert bringt auch nix ...
Rausfinden welches die richtige Codepage ist?


Ja, weil deine Strings bereits Unicode sind, also bereits falsch von "ANSI" aus konvertiert wurden und somit die Zeichen nun andere Codes besitzen.
Sei froh, dass wir keine MultiByteCodepage haben, so wie Chinesen und Co.
Denn wie beim UTF-8 können falsche ungültige Zeichenpaare zu Fehlern führen, was auch gern die komplette Übersetzung vernichtet und z.B. einen Leerstring oder manchmal auch eine Exception liefert.

Finger weg von String/WideString/UnicodeString, beim einlesen.
AnsiString ... nja, eigentlich RawByteString oder dirtekt AnsiString(CP_OEMCP).

Delphi-Quellcode:
#132
Chr($84)
Char($84)
AnsiChar($84)
WideChar($84)
#$84
#$0084
ist nicht immer das Selbe, vor allem die letzten Beiden nicht.
Rein logisch mögen die letzten Beiden den "gleichen" Wert haben, bezogen auf ein Char aka WideChar, aber der Compiler interpretiert es unterschiedlich.
Das eine ist ANSI und wird mit der aktuellen Codepage übersetzt und das Andere ist direkt Unicode.


Einmal kann man direkt im Windows spielen, aber nur wenn mit ANSI-APIs gearbeitet.
Bei Google suchenSetFileApisToOEM

RawByteString, bzw. ein AnsiChar-Array bzw. aber besser ein Byte-Array (TBytes)
und dann
Delphi-Referenz durchsuchenTEncoding.GetString
Delphi-Referenz durchsuchenTEncoding.Convert


Oder bei sowas wie TStringList, TStringStream oder sonstwas die richtige Codepage bzw. Delphi-Referenz durchsuchenTEncoding.
Delphi-Quellcode:
TMBCSEncoding.Create(CP_OEMCP

joehd 13. Aug 2023 22:55

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
danke für die Antwort die Datei wollte ich eigentlich nicht verändern ich kann mal ein Snipe anhängen der Originaldatei. Wenn ich sie mit dem DOS Editor öffne ist alles OK. siehe Anhang.


0330211FA Muster ä Ä ö Ö ü Ü ß
so sieht es im DOS Editor aus Windows XP ...

OK ich habe mal geschaut nach deinem Encoding da gibt es eine überladene Funktion

procedure LoadFromFile(const FileName: string; Encoding: TEncoding); overload; virtual;

Jetzt fehlt nur noch der Decoder ;-)

himitsu 13. Aug 2023 23:00

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
 
Hatte oben noch bissl was nachgetragen.

Es ging darum wie du die Datei im Delphi einliest, nicht um die Datei selber.

Einfach ReadLn in einen String/UnicodeString
oder TStringList mit falscher Codepage
und schon ist alles im Arsch.

Wenn ich eine russische Datei einlese, dabei alles, was ich nicht verstehe, mit einem vielleicht halbwegs ähnlich aussehendem deutschen Buchstaben in die Variable schreibe, dann kann damit ein Anderer nicht unbedingt viel anfangen.

joehd 13. Aug 2023 23:05

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
 
Ach so das Einlesen mit der Standard Ladefile im Tmemo

procedure LoadFromFile(const FileName: string);


jetzt gefunden

procedure LoadFromFile(const FileName: string; Encoding: TEncoding); overload; virtual;

Jetzt fehlt nur noch welche Decoding ... ( wusste garnicht das es die überladene Funktion gibt )

joehd 13. Aug 2023 23:13

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
 
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;

Uwe Raabe 13. Aug 2023 23:47

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
 
Wenn es unter DOS mit dem im Deutschen üblichen OEM-Zeichensatz codiert ist, dann kannst du dir ein passendes Encoding selbst erstellen:
Delphi-Quellcode:
myEncoding := TMBCSEncoding.Create(850);

KodeZwerg 14. Aug 2023 04:58

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
 
Liste der Anhänge anzeigen (Anzahl: 1)
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;

himitsu 14. Aug 2023 09:35

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
 
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;

Uwe Raabe 14. Aug 2023 10:16

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
 
Da der Reader mit
Delphi-Quellcode:
TEncoding.Ansi
erzeugt wurde, erfolgt die fehlerhafte Umwandlung in Unicode bereits im
Delphi-Quellcode:
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.

KodeZwerg 14. Aug 2023 12:06

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

Uwe Raabe 14. Aug 2023 13:26

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
 
Zitat:

Zitat von KodeZwerg (Beitrag 1525596)
Dies sollte dem Beispiel von Uwe schon recht nahe kommen.

In der Tat tut
Delphi-Quellcode:
GetEncoding
auch nichts anderes, solange die übergebene Codepage keinem der im
Delphi-Quellcode:
case
angegebenen Sonderfälle entspricht.

Allerdings könnte man es ja auch mal mit einem simplem
Delphi-Quellcode:
AMemo.LoadFromFile(AFileName, Encoding);
versuchen - so wegen ohne viel schnick-schnack...

joehd 14. Aug 2023 19:57

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
 
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;

himitsu 14. Aug 2023 20:08

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
 
selbst-erstellte TEncoding freigeben (Free)

nur die 5 Standard-Encodings, welche aus gewissen Property/Methoden raus kommen ... die nicht freigeben.

joehd 16. Aug 2023 18:10

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
 
Danke himitsu stimmt hatte ich vergessen leider kann ich es nicht mehr editieren ...
DANKE


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 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