![]() |
Klartext -> ANSI -> Klartext
Hi!
Ich möchte einen Text nach ANSI konvertieren und so anpassen, dass ich diesen einfach in HTML benutzen kann. Ich hab das so gelöst (funktioniert auch teilweise):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var s:String; i:Integer; begin s:=Edit1.Text; Memo1.Text:=s; For i:=0 to 255 do begin Memo1.text := StringReplace(Memo1.text, chr(i), '&#'+IntToStr(i)+';',[rfReplaceAll]); end; end; Die Problemkinder sind die Zeichen: & # ; Wenn man es im HTML-Dokument nachher wieder "zurückübersetzt" sieht merkt man das etwas nicht ganz funktioniert hat. Wisst ihr, wie man das Problem lösen kann? MfG Cruso |
Re: Klartext -> Unicode -> Klartext
Abgeseh, das ich nicht weiß was du eigentlich vorhast, könntest du die Problemzeichen zuerst konvertieren.
|
Re: Klartext -> ANSI -> Klartext
Und wie bekomme ich die Problemzeichen aus meiner For-Schleife raus?
|
Re: Klartext -> ANSI -> Klartext
Ich hab das jetzt so gemacht:
Delphi-Quellcode:
Allerdings funktioniert das ganze immernoch nicht.
procedure TForm1.Button1Click(Sender: TObject);
var s:String; i:Integer; begin s:=Edit1.Text; Memo1.Text:=s; For i:=0 to 255 do begin if not (i=35) or (i=38) or (i=59) then Memo1.text := StringReplace(Memo1.text, chr(i), '&#'+IntToStr(i)+';',[rfReplaceAll]); end; end; |
Re: Klartext -> ANSI -> Klartext
Delphi-Quellcode:
not (i=35) or (i=38) or (i=59)
//wird zu not ((i=35) or (i=38) or (i=59)) |
Re: Klartext -> ANSI -> Klartext
Die Zeichen haben den Code 23, 26, 38
|
Re: Klartext -> ANSI -> Klartext
Warum verwendest Du ein Integer als Zählvariable?
Das sind nur unnötige IntToStr-Unwandlungen die Resourcen fressen. Mein Vorschalg:
Delphi-Quellcode:
//Edit:
procedure TForm1.Button1Click(Sender: TObject);
var i: Char; begin Memo1.Text := Edit1.Text; For i := Low(Char) to High(Char) do if not (i in [#35, #38, #59]) then Memo1.Text := StringReplace(Memo1.Text, i, '&#'+IntToStr(Ord(i))+';',[rfReplaceAll]); end; Fehler korrigiert: Eine IntToStr-Umwandlung brauch man doch - aber ich find's trotzdem so übersichtlicher. Und wozu die zusätzliche String-Variable ist, ist mir auch unklar. |
Re: Klartext -> ANSI -> Klartext
Zitat:
Zitat:
|
Re: Klartext -> ANSI -> Klartext
Ich hab jetzt alles einmal ausprobiert, doch die Fehler schleichen sich bei allen Methoden ein.
|
Re: Klartext -> ANSI -> Klartext
Zitat:
|
Re: Klartext -> ANSI -> Klartext
Moin cruso,
und bitte nicht immer Memo.Text verwenden. Einmal in eine Stringvariable übertragen, dann alle Operationen mit dieser Stringvariable durchführen, und anschliessend wieder in Memo.Text übertragen. Die Performance wird's Dir danken, da bei jedem Lesezugriff auf Text der Wert aus allen Zeilen zusammengebaut wird. Beim Schreiben dann der umgekehrte Weg: Es werden die Zeilen neu erzeugt. |
Re: Klartext -> ANSI -> Klartext
Zitat:
|
Re: Klartext -> ANSI -> Klartext
Hab meinen Code nochmal überarbeitet, so müsste es gehen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var s: String; i: Char; begin s := Edit1.Text; s := StringReplace(s, #35, '#'+';', [rfReplaceAll]); s := StringReplace(s, #38, '&'+';', [rfReplaceAll]); s := StringReplace(s, #59, ';'+';', [rfReplaceAll]); //jeweils das '+' weglassen, geht hir nur nicht anders, weil die Zeichen sonst automatisch konvertiert werden... For i := Low(Char) to High(Char) do s := StringReplace(s, i, '&#'+IntToStr(Ord(i))+';',[rfReplaceAll]); Memo1.Text := s; end; |
Re: Klartext -> ANSI -> Klartext
Ich sollte ne Brille aufsetzen ;-)
|
Re: Klartext -> ANSI -> Klartext
Es funktionier leider immernoch nicht.
|
Re: Klartext -> ANSI -> Klartext
Hallo cruso,
wenn du die "Sonderzeichen" nicht verarbeitest, werden sie dir in der Ausgabe fehlen... Der Fehler bei den vorgestellten Lösungen besteht darin, daß bei nachfolgenden StringReplace-Aufrufen auch bereits eingebaute Ziffern ersetzt werden. Hier eine Alternative:
Delphi-Quellcode:
Gruß Hawkeye
function Convert (const aText: string): string;
var i: Integer; begin Result := ''; for i := 1 to Length(aText) do Result := Result + '&#' + IntToStr(Ord(aText[i])) + ';'; end; |
Re: Klartext -> ANSI -> Klartext
Ay cruso,
256 mal StringReplace über einen Memo.Text laufen zu lassen ist aus mehr als einem Grund nicht so genial. Da bietet sich eher die simple Iteration an:
Delphi-Quellcode:
Aber auch das ist noch nicht genial, da ja nur ganz wenige Zeichen wirklich Probleme machen: Ampersand, LessThan, GreaterThan.
function HTMLEncode(s: String): String;
var i: Integer; ce: String; // character entity begin SetLength(Result, Length(s) * 6); for i := 1 to Length(s) do begin ce := Format('&#%.3d;', [Ord(s[i])]); Move(ce[1], Result[i * 6 - 5], 6); end; end; Wenn du die Daten später in einer WebBrowser-Lomponente anzeigen willst, dann ist gar keine Kodierung nötig, da du den Text einfach der Eigenschaft innerText eines Elementes zuweisen kannst. Grüße vom marabu |
Re: Klartext -> ANSI -> Klartext
So aber:
Delphi-Quellcode:
Wobei man noch die Zahlen berücksichtigen muss.
procedure TForm1.Button1Click(Sender: TObject);
var s: String; i: Char; begin s := Edit1.Text; s := StringReplace(s, #35, '#'+';', [rfReplaceAll]); s := StringReplace(s, #38, '&'+';', [rfReplaceAll]); s := StringReplace(s, #59, ';'+';', [rfReplaceAll]); //jeweils das '+' weglassen! For i := Low(Char) to High(Char) do if not (i in [#35, #38, #59]) then //das muss doch hin! s := StringReplace(s, i, '&#'+IntToStr(Ord(i))+';',[rfReplaceAll]); Memo1.Text := s; end; Genauso wie die Zeichen #35, #38, #59 sollte man auch die Zahlen #48..#57 behandeln. Ich würde trotzdem Hawkeye's Code bevorzugen... |
Re: Klartext -> ANSI -> Klartext
Danke an alle!
Jetzt funktionierts... |
Re: Klartext -> ANSI -> Klartext
Leute, Leute, Leute.
Dieser Thread demonstriert wohl ganz gut das Problem an der Delphi Praxis: Zuviele hilfsbereite Menschen denken nicht nach bevor sie auf schlecht formulierte Fragen hilfebedürftiger Menschen antworten (siehe dazu auch ![]() Appell an alle: ERST denken, DANN schreiben. Ist nicht soo schwer. Und cruso, per Debugging hättest Du das alles selbst rausbekommen können. Das gehört zum Programmieren nunmal dazu, dass man im Fehlerfall das ganze mal mit kleinen Beispielen probiert und dabei den guten alten Debugger nutzt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 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