![]() |
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:
Bringt auch nix. Er findet die flaschen Codes nicht.
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]); 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 |
AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
Zitat:
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:
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:
ist nicht immer das Selbe, vor allem die letzten Beiden nicht.
#132
Chr($84) Char($84) AnsiChar($84) WideChar($84) #$84 #$0084 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. ![]() RawByteString, bzw. ein AnsiChar-Array bzw. aber besser ein Byte-Array (TBytes) und dann ![]() ![]() Oder bei sowas wie TStringList, TStringStream oder sonstwas die richtige Codepage bzw. ![]()
Delphi-Quellcode:
TMBCSEncoding.Create(CP_OEMCP
|
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 ;-) |
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. |
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 ) |
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; |
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);
|
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; |
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? ![]() Fand jetzt nur was zum Lesen, aber nichts zum Zuweisen ![]() ![]() und im TFont.SetCharset hab ich mich im Fontmanager verloren und sehe nirgends, dass damit auch was gemacht wird. Obwohl, das Wiki sagt ![]() 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; |
AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
Da der Reader mit
Delphi-Quellcode:
erzeugt wurde, erfolgt die fehlerhafte Umwandlung in Unicode bereits im
TEncoding.Ansi
Delphi-Quellcode:
, 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.
Reader.Readline
|
AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
Liste der Anhänge anzeigen (Anzahl: 1)
Zweiter Versuch ohne viel schnick-schnack:
Delphi-Quellcode:
// hab noch ein argument zum easy wechseln hinzugefügt
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; Dies sollte dem Beispiel von Uwe schon recht nahe kommen. |
AW: Konvertierung der Umlaute einer Dosdatei im Tmemo
Zitat:
Delphi-Quellcode:
auch nichts anderes, solange die übergebene Codepage keinem der im
GetEncoding
Delphi-Quellcode:
angegebenen Sonderfälle entspricht.
case
Allerdings könnte man es ja auch mal mit einem simplem
Delphi-Quellcode:
versuchen - so wegen ohne viel schnick-schnack...
AMemo.LoadFromFile(AFileName, Encoding);
|
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; |
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. |
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