Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Sonderzeichen umwandeln in ISO-8859-1 und Konsorten (https://www.delphipraxis.net/49224-sonderzeichen-umwandeln-iso-8859-1-und-konsorten.html)

Catbytes 7. Jul 2005 09:08


Sonderzeichen umwandeln in ISO-8859-1 und Konsorten
 
Hallo,

folgender Code ist gegeben:

Delphi-Quellcode:
function TForm1.Sonderzeichen(S: string): string;
var
  P: Integer;
begin
  repeat
    P := Pos('&', S);
    if P > 0 then
    begin
      Delete(S, P, 1);
      Insert('&', S, P);
    end;
  until P = 0;
  repeat
    P := Pos('<', S);
    if P > 0 then
    begin
      Delete(S, P, 1);
      Insert('<', S, P);
    end;
  until P = 0;
  repeat
    P := Pos('>', S);
    if P > 0 then
    begin
      Delete(S, P, 1);
      Insert('>', S, P);
    end;
  until P = 0;
  Result := S;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit2.Text := Sonderzeichen(Edit1.Text);
end;
Das Problem: Beim Zeichen "&" (kaufmännisches Und) verweist er andauernd auf sich selbst und erzeugt eine Endlosschleife, da ja das Zeichen im Code & selbst vorkommt.

Sätze wie:

<Dies ist ein Satz>

werden problemlos in

<Dies ist ein Satz>

umgewandelt.

Der Satz:

Mustermann GmbH & Co. KG

landet (logierschweise) in der Endlosschleife.

Ich habe das mit

Delphi-Quellcode:
repeat
...
until
deshalb eingeführt, weil es ja sein kann, daß in einer Zeile mehrere Zeichen vorkommen können.

Frage: Gibt es eine elegantere Lösung, um Sonderzeichen HTML-Konform (bzw. ISO-8859-1-Konform für bmeCAT-Kataloge) umzuwandeln. Meine Function oben ist nicht das gelbe vom Ei (ich weiß), hat aber bisher gute Dienste geleistet - bis eben die erste Firma mit "&" auftauchte. :mrgreen:

Bietet vielleicht Delphi selbst sowas an? Gibt es fertige Routinen, die man sich anschauen kann?

Für jede Hilfe dankbar...

Hinweis: Der Editor wandelt meine Codes in lesbare Zeichen um. Eigentlich heißt es oben: & # 3 8 ; (ohne Leerzeichen) etc. (also das Gegenstück des jeweiligen Zeichens, wie hier).

marabu 7. Jul 2005 10:26

Re: Sonderzeichen umwandeln in ISO-8859-1 und Konsorten
 
Hallo,

nimm das hier solange du nichts besseres findest:

Delphi-Quellcode:
function StrToHtml(s: string): string;
const
  EntityChars = '"&<>''';
  EntityStrings: array [1..5] of string
    = ('&quot;', '&amp;', '&lt;', '&gt;', '&apos;');
var
  i, j: integer;
begin
  for i := Length(s) downto 1 do begin
    j := Pos(s[i], EntityChars);
    if j > 0 then begin
      Delete(s, i, 1);
      Insert(EntityStrings[j], s, i);
    end else
    if not (s[i] in [#32..#127]) then begin
      Delete(s, i, 1);
      Insert('&#' + IntToStr(Ord(s[i])) + ';', s, i);
    end;
  end;
  Result := s;
end;
Grüße vom marabu

ibp 7. Jul 2005 10:37

Re: Sonderzeichen umwandeln in ISO-8859-1 und Konsorten
 
schau dir mal "stringreplace" an!

natürlich gibt es eine endlosschleife, er findet immer wieder das erste '&', auch wenn du es ersetzt hast!
ich verstehe denn sinn deines codes zwar nicht, warum wird ein '&' mit einem '&' ersetzt?
andere möglichkeit:
Delphi-Quellcode:
for i:=1 to length(s) do
  case s[i] of
    '&': s[i]:='&';
    '<': s[i]:='<';
    ...
  end; // case
[edit] :wall: man sollte auch den text weiterlesen ein helau an marabu [/edit]


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