AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

StringReplace und seine Tücken

Ein Thema von Catbytes · begonnen am 7. Dez 2005 · letzter Beitrag vom 8. Dez 2005
Antwort Antwort
Seite 1 von 3  1 23   
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#1

StringReplace und seine Tücken

  Alt 7. Dez 2005, 10:28
Hallo,

benötigt werden 2 Memo-Felder und ein Button.

Dazu folgender Code:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  s: string;
begin
  Memo1.Clear;
  Memo1.Lines.Add('Mustermann GmbH & Co. KG');
  Memo1.Lines.Add('');
  Memo1.Lines.Add('Täler, Wälder; all das ist Natur & schön.');
  Memo2.Clear;
  for i := 0 to (Memo1.Lines.Count - 1) do
  begin
    s := StringReplace(Memo1.Lines[i], '&', '& # 3 8 ;', [rfReplaceAll]);
    s := StringReplace(s, ';', '& # 5 9 ;', [rfReplaceAll]);
    s := StringReplace(s, 'ä', '& # 2 2 8 ;', [rfReplaceAll]);
    Memo2.Lines.Add(s);
  end;
end;
^^^Edit: Leerzeichen oben bei den ISO-Codes wegdenken - Der Editor hier übersetzt das als Zeichen!

Das Problem:
Wenn StringReplace nun auf das &-Zeichen trifft, wird es korrekt übersetzt. Gleichzeitig wird aber auch geprüft, ob das Semikolon ( ; ) vorkommt - das wird ja aber schon mit dem Umsetzen vom &-Zeichen miterzeugt.

Er schreib dann:
Mustermann GmbH & # 3 8 & # 5 9 ; Co. KG (denkt euch die Leerzeichen weg, sonst interpretiert dies der Editor als Sonderzeichen).

Ich wollte diese Tabelle nutzen, um einen ISO-8859-1-Konverter zu basteln, den ich für eine XML-Datei brauche.

Hat jemand eine Idee, wie ich dieses rekursive verhalten von StringReplace umgehen kann?
Catbytes
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: StringReplace und seine Tücken

  Alt 7. Dez 2005, 10:33
Zitat von Catbytes:
Gleichzeitig wird aber auch geprüft, ob das Semikolon ( ; ) vorkommt - das wird ja aber schon mit dem Umsetzen vom &-Zeichen miterzeugt.
Wie miterzeugt

Ich versteh deinen Code nicht, oder viel mehr was der machen SOLL. Du ersetzt ein & durch ein & Was soll das denn werden?[/quote]

Ausserdem, anstatt jede einzelne Zeile deines Memo1 zu durchlaufen, kannst du auch gleich so verfahren:

memo2.lines.text := StringReplace (memo1.lines.text,'&','&',[rfReplaceAll]) ;
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.330 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: StringReplace und seine Tücken

  Alt 7. Dez 2005, 10:41
Ich sehe da nix Rekursives.
Du machst erst ein StringReplace, wodurch du ein Semikolon einfügst.
Danach machst du ein weiteres StringReplace, wo du das Semikolon durch etwas anderes ersetzt.

Was erwartest du denn? Dass deine zweite Umwandlung deine erste vernachlässigt?
Nimm doch eine andere Reihenfolge.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#4

Re: StringReplace und seine Tücken

  Alt 7. Dez 2005, 10:43
Zitat von Jelly:
Ich versteh deinen Code nicht, oder viel mehr was der machen SOLL. Du ersetzt ein & durch ein & Was soll das denn werden?
Sorry - habs zu spät gemerkt. Beachte mein Edit. Es soll der ISO-Code erzeugt werden - das hat der Editor gleich als Zeichen übersetzt

Zitat von Jelly:
Ausserdem, anstatt jede einzelne Zeile deines Memo1 zu durchlaufen, kannst du auch gleich so verfahren:

memo2.lines.text := StringReplace (memo1.lines.text,'&','&',[rfReplaceAll]) ;
Klar - ich muß es aber so machen, weil da noch jede Menge Code dazwischensteht, wo ich Zugriff auf die einzelne Zeile eines Memos brauche.

Aber auch ein:
Delphi-Quellcode:
  memo2.lines.text := StringReplace (memo1.lines.text,'&','& # 3 8 ;',[rfReplaceAll]) ;
  memo2.lines.text := StringReplace (memo2.lines.text,';','& # 5 9 ;',[rfReplaceAll]) ;
  memo2.lines.text := StringReplace (memo2.lines.text,'ä','& # 2 2 8;',[rfReplaceAll]) ;
(^^^^Leerzeichen bei den ISO-Codes wegdenken!)

ändert daran nichts - es wird "falsch" übersetzt.
Catbytes
  Mit Zitat antworten Zitat
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#5

Re: StringReplace und seine Tücken

  Alt 7. Dez 2005, 10:45
Zitat von Jasocul:
Ich sehe da nix Rekursives.
Du machst erst ein StringReplace, wodurch du ein Semikolon einfügst.
Danach machst du ein weiteres StringReplace, wo du das Semikolon durch etwas anderes ersetzt.

Was erwartest du denn? Dass deine zweite Umwandlung deine erste vernachlässigt?
Nimm doch eine andere Reihenfolge.
Geanu das erwarte ich (von einem Computer)

Ich bräuchte quasi eine Funktion, wo ich die zu suchenden und zu übersetzenden Tags z.B. als Array angeben kann, damit er mehrere auf einmal sucht und ersetzt.
Catbytes
  Mit Zitat antworten Zitat
Benutzerbild von Daniel Schuhmann
Daniel Schuhmann

Registriert seit: 16. Jul 2005
Ort: München
391 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: StringReplace und seine Tücken

  Alt 7. Dez 2005, 10:46
Genau, in der richtigen Reihenfolge ist es kein Problem. Wenn Du zuerst das & ersetzt, paßt doch alles.

Delphi-Quellcode:
var
  S: String;
begin
  S := 'Hallöchen ältere Leute & Übrige Leser mit schönen Büchern';
  S := StringReplace(S, '&', '"', [rfReplaceAll]);
  S := StringReplace(S, 'ä', 'ä', [rfReplaceAll]);
  S := StringReplace(S, 'ö', 'ö', [rfReplaceAll]);
  S := StringReplace(S, 'ü', 'ü', [rfReplaceAll]);
  S := StringReplace(S, 'Ä', 'Ä', [rfReplaceAll]);
  S := StringReplace(S, 'Ö', 'Ö', [rfReplaceAll]);
  S := StringReplace(S, 'Ü', 'Ü', [rfReplaceAll]);
  ShowMessage(S);
end;
Ich weiß, der Satz ist schwachsinnig, aber dadurch kommen ein paar Umlaute vor...

Problematisch ist es, wenn Du den geänderten Text durch ShowMessage anzeigen läßt, hier scheinen die &-Zeichen verschwunden zu sein (in Wirklichkeit werden sie nur nicht angezeigt, weil sie zur Kodierung der unterstrichenen Buchstaben verwendet werden).
Daniel Schuhmann
  Mit Zitat antworten Zitat
Benutzerbild von Catbytes
Catbytes

Registriert seit: 7. Sep 2002
Ort: Heckendalheim
353 Beiträge
 
Delphi XE5 Enterprise
 
#7

Re: StringReplace und seine Tücken

  Alt 7. Dez 2005, 10:53
Zitat von Daniel Schuhmann:
Genau, in der richtigen Reihenfolge ist es kein Problem. Wenn Du zuerst das & ersetzt, paßt doch alles.
Genau das mache ich doch - oben im Quellcode beginne ich ja mit dem &-Zeichen

Aber auch da habe ich schon rumgebastelt und Dinge getauscht - mit dem Ergebnis, daß es dann an anderen Stellen "falsch" ist.

Ich will mir gar nicht vorstellen, was passiert, wenn ich noch das #-Zeichen übersetzen möchte...

Zitat von Daniel Schuhmann:
Problematisch ist es, wenn Du den geänderten Text durch ShowMessage anzeigen läßt, hier scheinen die &-Zeichen verschwunden zu sein (in Wirklichkeit werden sie nur nicht angezeigt, weil sie zur Kodierung der unterstrichenen Buchstaben verwendet werden).
Das wäre nicht mein Problem, weil die XML-Datei später bei einem Kunden eingelesen wird - wie der sein System konfiguriert hat (SAP-EPB) ist nicht mein Bier.
Catbytes
  Mit Zitat antworten Zitat
diComm

Registriert seit: 26. Jan 2005
68 Beiträge
 
#8

Re: StringReplace und seine Tücken

  Alt 7. Dez 2005, 10:54
Zitat:
Genau, in der richtigen Reihenfolge ist es kein Problem. Wenn Du zuerst das & ersetzt, paßt doch alles.
Naja, wohl nicht ganz, denn du hast das ";" vergessen, das er auch noch ersetzen will.

@ Catbytes
Du könntest zuerst das ; ersetzen und dann in einem IF zuerst prüfen, ob auf das & ein # folgt bevor du das & ersetzt. vielleicht etwas aufwändig, aber so könnte es gehen...
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.330 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: StringReplace und seine Tücken

  Alt 7. Dez 2005, 10:56
Ersetze zuerst das "#" und das ";". Danach machst du den Rest.
Peter
  Mit Zitat antworten Zitat
diComm

Registriert seit: 26. Jan 2005
68 Beiträge
 
#10

Re: StringReplace und seine Tücken

  Alt 7. Dez 2005, 11:01
Zitat:
Ersetze zuerst das "#" und das ";". Danach machst du den Rest.
wenn er zuerst das ; durch "& # 5 9;" ersetzt und anschlissend noch das & durch "& # 3 8;" wird auch das nicht klappen, das gibt dann ""& # 3 8; # 5 9; "
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 22:47 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