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
Seite 1 von 2  1 2      
joehd

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

Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 13. Aug 2023, 23:28
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
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 himitsu
himitsu

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

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 13. Aug 2023, 23:43
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.
TMBCSEncoding.Create(CP_OEMCP
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (13. Aug 2023 um 23:58 Uhr)
  Mit Zitat antworten Zitat
joehd

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

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 13. Aug 2023, 23:55
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
Angehängte Dateien
Dateityp: txt el_export.txt (32 Bytes, 11x aufgerufen)
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 00:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 14. Aug 2023, 00:00
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (14. Aug 2023 um 00:02 Uhr)
  Mit Zitat antworten Zitat
joehd

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

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 14. Aug 2023, 00:05
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 )
joe
immer wenn ich was suche finde ich es hier komisch oder ?
Arbeite mit D3 D5 D2007 DXE Prof
  Mit Zitat antworten Zitat
joehd

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

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 14. Aug 2023, 00: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.453 Beiträge
 
Delphi 12 Athens
 
#7

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 14. Aug 2023, 00: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
 
#8

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 14. Aug 2023, 05: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;
Miniaturansicht angehängter Grafiken
bild_2023-08-14_055800434.png  
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 14. Aug 2023, 10: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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

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

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

AW: Konvertierung der Umlaute einer Dosdatei im Tmemo

  Alt 14. Aug 2023, 11: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
Antwort Antwort
Seite 1 von 2  1 2      


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 05:55 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