Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Klartext -> ANSI -> Klartext (https://www.delphipraxis.net/73758-klartext-ansi-klartext.html)

cruso 23. Jul 2006 17:49


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

mkinzler 23. Jul 2006 17:52

Re: Klartext -> Unicode -> Klartext
 
Abgeseh, das ich nicht weiß was du eigentlich vorhast, könntest du die Problemzeichen zuerst konvertieren.

cruso 23. Jul 2006 17:54

Re: Klartext -> ANSI -> Klartext
 
Und wie bekomme ich die Problemzeichen aus meiner For-Schleife raus?

cruso 23. Jul 2006 17:58

Re: Klartext -> ANSI -> Klartext
 
Ich hab das jetzt so gemacht:

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
if not (i=35) or (i=38) or (i=59) then
Memo1.text := StringReplace(Memo1.text, chr(i), '&#'+IntToStr(i)+';',[rfReplaceAll]);
end;
end;
Allerdings funktioniert das ganze immernoch nicht.

Dax 23. Jul 2006 18:00

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))

mkinzler 23. Jul 2006 18:00

Re: Klartext -> ANSI -> Klartext
 
Die Zeichen haben den Code 23, 26, 38

Martin K 23. Jul 2006 18:02

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:
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;
//Edit:
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.

Dax 23. Jul 2006 18:05

Re: Klartext -> ANSI -> Klartext
 
Zitat:

Zitat von mkinzler
Die Zeichen haben den Code 23, 26, 38

Nein, es sind 35, 38 und 59.

Zitat:

Zitat von Martin K
Mein Vorschalg:
Delphi-Quellcode:
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, '&#'+Ord(i)+';',[rfReplaceAll]);
end;

Ord(i) == Byte(i) - ;)

cruso 23. Jul 2006 18:11

Re: Klartext -> ANSI -> Klartext
 
Ich hab jetzt alles einmal ausprobiert, doch die Fehler schleichen sich bei allen Methoden ein.

mkinzler 23. Jul 2006 18:12

Re: Klartext -> ANSI -> Klartext
 
Zitat:

mkinzler hat folgendes geschrieben:
Die Zeichen haben den Code 23, 26, 38
Nein, es sind 35, 38 und 59.
hab ausversehen die Hex-Werte gepostet.

Christian Seehase 23. Jul 2006 18:12

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.

Dax 23. Jul 2006 18:14

Re: Klartext -> ANSI -> Klartext
 
Zitat:

Zitat von mkinzler
hab ausversehen die Hex-Werte gepostet.

Dann ists aber nicht 38, sondern 3b ;)

Martin K 23. Jul 2006 18:15

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, '&#35'+';', [rfReplaceAll]);
  s := StringReplace(s, #38, '&#38'+';', [rfReplaceAll]);
  s := StringReplace(s, #59, '&#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;

mkinzler 23. Jul 2006 18:15

Re: Klartext -> ANSI -> Klartext
 
Ich sollte ne Brille aufsetzen ;-)

cruso 23. Jul 2006 18:21

Re: Klartext -> ANSI -> Klartext
 
Es funktionier leider immernoch nicht.

Hawkeye219 23. Jul 2006 18:21

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:
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;
Gruß Hawkeye

marabu 23. Jul 2006 18:25

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:
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;
Aber auch das ist noch nicht genial, da ja nur ganz wenige Zeichen wirklich Probleme machen: Ampersand, LessThan, GreaterThan.

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

Martin K 23. Jul 2006 18:25

Re: Klartext -> ANSI -> Klartext
 
So aber:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var s: String; i: Char;
begin
  s := Edit1.Text;
  s := StringReplace(s, #35, '&#35'+';', [rfReplaceAll]);
  s := StringReplace(s, #38, '&#38'+';', [rfReplaceAll]);
  s := StringReplace(s, #59, '&#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;
Wobei man noch die Zahlen berücksichtigen muss.
Genauso wie die Zeichen #35, #38, #59 sollte man auch die Zahlen #48..#57 behandeln.

Ich würde trotzdem Hawkeye's Code bevorzugen...

cruso 23. Jul 2006 18:34

Re: Klartext -> ANSI -> Klartext
 
Danke an alle!
Jetzt funktionierts...

bttb930 23. Jul 2006 19:27

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 http://www.delphipraxis.net/internal...ct.php?t=88355 ).

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