Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Leerzeichen in Unterstriche umwandeln (https://www.delphipraxis.net/128749-leerzeichen-unterstriche-umwandeln.html)

Snow Dragon 5. Feb 2009 11:05


Leerzeichen in Unterstriche umwandeln
 
Hallo,
ich hab ein Problem mit Leerzeichen, bzw. dem Umwandeln.
Und zwar schreibe ich gerade an einem Programm was Text im CeasarCode verschüsseln soll, das halt am besten mit Leerzeichen oder Umwandlung der Leerzeichen in _ oder der ähnlichen. Der Quellcode sieht immoment wie folgt aus:
Delphi-Quellcode:
begin
  s:=edein.text;
  sch:=StrToint(lbein.text);
  FOR I:=1 TO length(s) DO
    BEGIN
    c:=s[i];
    case c of
      'A' .. 'Z' : s1 := s1 + c;
      'a' .. 'z' : s1 := s1 + upcase(c);
      'ß'       : s1 := s1 + 'SS';
      'ä'       : s1 := s1 + 'AE';
      'ö'       : s1 := s1 + 'OE';
      'ü'       : s1 := s1 + 'UE';
      'Ä'       : s1 := s1 + 'AE';
      'Ö'       : s1 := s1 + 'OE';
      'Ü'       : s1 := s1 + 'UE';
    END;
    END;
    aus:='';
   for ii:=1 to length(s1) do
    begin
     c:=s1[ii];
     ASCII:=ord(c)+sch;
     aus:=aus+CHR(ASCII);
    end;
edaus.lines.add(aus);
end;
Das ist der Programmteil fürs Verschlüsseln. Wenn ich da allerdings nun einen Satz mir Leerzeichen eingebe kommt unten ein zusammengequetschtes Zeug raus und ist nach dem Entschlüsseln kaum zu lesen. :gruebel:

Freu mic hschon auf eure Beiträge :)

mkinzler 5. Feb 2009 11:10

Re: Leerzeichen in Unterstriche umwandeln
 
Schau dir mal StringReplace() an

nahpets 5. Feb 2009 12:15

Re: Leerzeichen in Unterstriche umwandeln
 
Hallo,
Zitat:

Zitat von Snow Dragon
Hallo,
ich hab ein Problem mit Leerzeichen, bzw. dem Umwandeln.
Und zwar schreibe ich gerade an einem Programm was Text im CeasarCode verschüsseln soll, das halt am besten mit Leerzeichen oder Umwandlung der Leerzeichen in _ oder der ähnlichen. Der Quellcode sieht immoment wie folgt aus:
Delphi-Quellcode:
begin
  s:=edein.text;
  sch:=StrToint(lbein.text);
  FOR I:=1 TO length(s) DO
    BEGIN
    c:=s[i];
    case c of
      'A' .. 'Z' : s1 := s1 + c;
      'a' .. 'z' : s1 := s1 + upcase(c);
      'ß'       : s1 := s1 + 'SS';
      'ä'       : s1 := s1 + 'AE';
      'ö'       : s1 := s1 + 'OE';
      'ü'       : s1 := s1 + 'UE';
      'Ä'       : s1 := s1 + 'AE';
      'Ö'       : s1 := s1 + 'OE';
      'Ü'       : s1 := s1 + 'UE';
    END;
    END;
    aus:='';
   for ii:=1 to length(s1) do
    begin
     c:=s1[ii];
     ASCII:=ord(c)+sch;
     aus:=aus+CHR(ASCII);
    end;
edaus.lines.add(aus);
end;
Das ist der Programmteil fürs Verschlüsseln. Wenn ich da allerdings nun einen Satz mir Leerzeichen eingebe kommt unten ein zusammengequetschtes Zeug raus und ist nach dem Entschlüsseln kaum zu lesen. :gruebel:

Freu mic hschon auf eure Beiträge :)

erweitere doch Deine Case-Abfrage um ein
Delphi-Quellcode:
      ' '       : s1 := s1 + '_';
Welchen Wert enthält sch?
Wenn Ord(c) + sch > 255 wird, können aus Chr(Ascii) nichtdarstellbare Zeichen werden.

SirThornberry 5. Feb 2009 12:25

Re: Leerzeichen in Unterstriche umwandeln
 
Zitat:

Zitat von mkinzler
Schau dir mal StringReplace() an

Wenn es um mehrere Ersetzungen geht ist die Schleife wohl der sinnvollere Weg.

Tyrael Y. 5. Feb 2009 12:30

Re: Leerzeichen in Unterstriche umwandeln
 
Zitat:

Zitat von SirThornberry
Zitat:

Zitat von mkinzler
Schau dir mal StringReplace() an

Wenn es um mehrere Ersetzungen geht ist die Schleife wohl der sinnvollere Weg.


Wie kommst du denn darauf?

Zitat:

type
TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);
function StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): string;

Beschreibung

Mit StringReplace ersetzen Sie in dem angegebenen String den im Parameter OldPattern festgelegten Sub-String mit dem im Parameter NewPattern übergebenen neuen Sub-String. StringReplace nimmt an, daß der String Multibyte-Zeichen enthalten kann.

Wenn im Parameter Flags nicht rfReplaceAll enthalten ist, wird nur das erste Vorkommen von OldPattern im String S ersetzt. Andernfalls werden alle Instanzen von OldPattern durch NewPattern ersetzt.

Wenn der Parameter Flags rfIgnoreCase enthält, wird die Groß-/Kleinschreibung nicht berücksichtigt.

Jens Hartmann 5. Feb 2009 12:46

Re: Leerzeichen in Unterstriche umwandeln
 
Hallo erstmal,

Schau die mal diesen Tread von mir an, ich habe auch das Problem gehabt diverse Zeichen zu ersetzten.

Vieleicht hilft Dir der ja weiter, dort habe ich dann auch die Lösung mit StringReplaced genutzt.

StringReplaced

MFG

Jens

himitsu 5. Feb 2009 12:56

Re: Leerzeichen in Unterstriche umwandeln
 
Zitat:

Zitat von Tyrael Y.
Zitat:

Zitat von SirThornberry
Wenn es um mehrere Ersetzungen geht ist die Schleife wohl der sinnvollere Weg.

Wie kommst du denn darauf?

Zitat:

type
TReplaceFlags = set of (rfReplaceAll, rfIgnoreCase);

er meinte mehrere verschiedene Ersetzungen
StringReplace erstetzt nur ein Zeichen/String (und das notfalls mehrmals)

aber irgendwo hier in der DP gab's 'ne StringReplace-Variante, der man statt Strings ganze Arrays übergeben konnte. (evtl. sogar in der CodeLib)

Snow Dragon 5. Feb 2009 14:55

Re: Leerzeichen in Unterstriche umwandeln
 
Zitat:

Zitat von nahpets
erweitere doch Deine Case-Abfrage um ein
Delphi-Quellcode:
      ' '       : s1 := s1 + '_';
Welchen Wert enthält sch?
Wenn Ord(c) + sch > 255 wird, können aus Chr(Ascii) nichtdarstellbare Zeichen werden.

das mit der erweiterten CASE abfrage ging leider nicht, so schlau war ich auchschon.
Sch steht hier für schlüssel und ist eine zahl die vom Benutzer gewählt wird also 5 oder 6 oder auch 1234, das geht soweit auch wieder zu entschlüsseln auch wenns bei großen zahlen meistens nach humbuk aussieht^^
kann man denn lehrzeilen mit StringReplace() ersetzen?

PS: Ein 'Hallo' würde mit nem Schlüssel von 1234 verschlüsselt ungefähr so aussehen:
!
Wie man erkennt erkennt man nichts aber kopiert mans ins Programm rein udn entschlüsselt gehts^^

nahpets 5. Feb 2009 15:22

Re: Leerzeichen in Unterstriche umwandeln
 
Hallo,
Zitat:

Zitat von Snow Dragon
Zitat:

Zitat von nahpets
erweitere doch Deine Case-Abfrage um ein
Delphi-Quellcode:
      ' '       : s1 := s1 + '_';
Welchen Wert enthält sch?
Wenn Ord(c) + sch > 255 wird, können aus Chr(Ascii) nichtdarstellbare Zeichen werden.

das mit der erweiterten CASE abfrage ging leider nicht, so schlau war ich auchschon.
Sch steht hier für schlüssel und ist eine zahl die vom Benutzer gewählt wird also 5 oder 6 oder auch 1234, das geht soweit auch wieder zu entschlüsseln auch wenns bei großen zahlen meistens nach humbuk aussieht^^
kann man denn lehrzeilen mit StringReplace() ersetzen?

PS: Ein 'Hallo' würde mit nem Schlüssel von 1234 verschlüsselt ungefähr so aussehen:
!
Wie man erkennt erkennt man nichts aber kopiert mans ins Programm rein udn entschlüsselt gehts^^

Leerzeilen könntest Du an zwei aufeinanderfolgende Zeilenumbrüchen (#13#10#13#10) erkennen, das müsste mit StringReplace eigentlich zu ersetzen sein.
Delphi-Quellcode:
StringReplace(Zeichenfolge,#13#10#13#10,'****',[rfReplaceAll]);

globetrotter77 5. Feb 2009 16:06

Re: Leerzeichen in Unterstriche umwandeln
 
lass mal besser die Umwandlung von ß und Umlauten sein, die ist irreversibel und damit nicht mehr entschlüsselbar.
Im Gegensatz zur Umwandlung zu Caesars Zeiten geht es doch darum, alle Zeichen eines Strings um den gleichen Versatz zu verschieben, oder?
Würde ich jedenfalls mal empfehlen, denn dann fängst du auch Kandidaten mit Akzenten etc. ein ...
Und dann reicht es völlig, die Position im zugrundeliegenden Zeichensatz zu ermitteln, den Versatz zu addieren und danach wieder in ein Zeichen zu verwandeln, allerdings modulo 256, weil sonst ein Überlauf entstehen könnte, bei dem ich nicht weiß, was Delphi draus macht.

Also z.B. so:
Delphi-Quellcode:

const versatz = 7;

function codieren(s: string): string;
var i: integer;
    c: char;  // ein Zeichen
    p: integer;
    x: string; // das Zwischenergebnis
begin
  x:='';
  for i:=1 to Length(s) do
  begin
    c:=s[i];
    p:=ord(c);
    p:=(p+versatz) mod 256;
    c:=chr(p);
    x:=x+c;
  end;
  Result:=x;
end;

function decodieren(s: string): string;
var i: integer;
    c: char;  // ein Zeichen
    p: integer;
    x: string; // das Zwischenergebnis
begin
  x:='';
  for i:=1 to Length(s) do
  begin
    c:=s[i];
    p:=ord(c);
    p:=(p-versatz) mod 256; // Minus statt Plus!
    c:=chr(p);
    x:=x+c;
  end;
  Result:=x;
end;
Man kann das natürlich auch zusammenfassen in z.B.
Delphi-Quellcode:
  x:=x+chr((ord(s[i])+/-versatz) mod 256);
das macht's aber eigentlich nur unlesbar und bringt kaum Vorteile.


Wichtig:
der resultierende String enthält in der Regel auch unlesbare bzw. nicht druckbare Zeichen, was aber normalerweise nichts machen dürfte, weil man es ja nicht lesen soll.
Das gibt nur Probleme, wenn man es auch in einer Datei abspeichern will.
Da gibt es zwei Möglichkeiten:
1) Speichern in binärer Datei, dann machen die Steuerzeichen nichts
2) Speichern in Textdatei, dann muss man die Routine abwandeln derart, dass nur die lesbaren Zeichen umgewandelt werden, also von #32 bis #255
Hierzu muss zunächst einmal eine Abbildung von #32..#255 auf #0..223 erfolgen, danach der gleiche Algorithmus, aber mit modulo 224, und danach wieder eine Abbildung von #0..#223 auf #32..#255 ... das war's!

Jens Hartmann 6. Feb 2009 17:37

Re: Leerzeichen in Unterstriche umwandeln
 
Hallo nahpets,

Zitat:

Leerzeilen könntest Du an zwei aufeinanderfolgende Zeilenumbrüchen (#13#10#13#10) erkennen, das müsste mit StringReplace eigentlich zu ersetzen sein.
Delphi-Quellcode: markieren
StringReplace(Zeichenfolge,#13#10#13#10,'****',[rfReplaceAll]);

Habe auch mel ein bißchen mit deinem Code gespielt. also ich bekomme es nicht hin ein Leerzeile aus einer Datei zu löschen. Das Problem ist, der Befehl von Dir wird zwar ausgeführt aber ohne Änderung.

Beim Debuggen, ändern sich meine Variablen nicht. Alle anderen StringReplaced Befehle werden ausgeführt und meine Variable ändert sich.

MFG

Jens

Snow Dragon 9. Feb 2009 09:05

Re: Leerzeichen in Unterstriche umwandeln
 
Hallo nochmal,
hab das ganze jetzt auch nochmal mit StringReplace() versucht, ging auchnicht. Genauso wie wenn ich in die Schliefe noch was einfüge kommt imemr ein zusammengeklatschter Text raus. Also aus "test test" wird 'TESTTEST'. Gibts vielleicht noch ne andere Möglichkeit?

himitsu 9. Feb 2009 09:36

Re: Leerzeichen in Unterstriche umwandeln
 
Wie sieht denn dein Code nun aus?
Wäre ja nicht schlecht, wenn wir dennoch den Fehler finden und du dabei lernst/erfährst warum es nicht ging.

Hast du beim StringReplace auch den Rückgabewert übernommen?
Ist oftmals ein/DER Fehler, warum da nix passiert :stupid:


Delphi-Quellcode:
VAR S: AnsiString;
    I: Integer;
    B, Schl: Byte;

BEGIN
  // ALLES in Großbuchstaben umwandeln
  S := AnsiUpperCase(edein.Text);
  // Umlaute ersetzen
  S := StringReplace(S, 'Ä', 'AE', [rfReplaceAll]);
  S := StringReplace(S, 'Ö', 'OE', [rfReplaceAll]);
  S := StringReplace(S, 'Ü', 'UE', [rfReplaceAll]);
  S := StringReplace(S, 'ß', 'SS', [rfReplaceAll]);
  // nicht erlaubte Zeichen rauslöschen
  FOR I := Length(S) DOWNTO 1 DO
    IF NOT (S[I] IN [' ', 'A'..'Z']) THEN
      Delete(S, I, 1);
  // Schlüssel holen
  Schl := StrToInt(lbein.Text);
  FOR I := 1 to Length(S) DO
    // das Leerzeichen wird nicht verarbeitet (war doch bei Cäsar so?)
    IF S[I] IN ['A'..'Z'] THEN
    BEGIN
      // bei Cäsar werden nur die Buchstaben in sich verschoben

      // Buchstabe in Zahl umwandeln und auf den Nullpunkt verschieben
      B := Ord(S[I]) - Ord('A');
      // Schlüssel zurechnen und den Zahlenbereich anpassen
      B := (B + Schl) MOD 26;
      // Zahl wieder in den Buchstabenbereich verschieben und in ein Zeichen Wandeln
      S[I] := Chr(B + Ord('A'));
    END;
    edaus.Text := S;
  END;
Buchstabe ... auf den Nullpunkt verschieben
ist nur, damit sich leichter Rechnen läßt, da es sonst etwa so aussehen würde:
Delphi-Quellcode:
VAR B, Schl: Integer;

Schl := StrToInt(lbein.Text);

IF S[I] IN ['A'..'Z'] THEN
BEGIN
  // bei Cäsar werden nur die Buchstaben in sich verschoben

  // Buchstabe in Zahl umwandeln
  B := Ord(S[I]);
  // Schlüssel zurechnen und den Zahlenbereich anpassen
  B := B + Schl;
  WHILE B < Ord('A') DO A := A + 26;
  WHILE B > Ord('Z') DO A := A - 26;
  // Zahl wieder in den Buchstabenbereich verschieben und in ein Zeichen Wandeln
  S[I] := Chr(B);
END;

Snow Dragon 10. Feb 2009 10:51

Re: Leerzeichen in Unterstriche umwandeln
 
snalso mit deiner prozedur klappt es jetzt^^ ich versteh zwar imemnoch nicht genau wieso er das bei mir nicht gemacht hatte, aber es geht, ist ja schonmal was. Der quellcode des programm steht am anfangsbeitrag hatte sich bis eben nicht viel geändert

himitsu 10. Feb 2009 11:58

Re: Leerzeichen in Unterstriche umwandeln
 
drum fragte ich ja nach dem letzen Code,
denn wenn ich ein
Delphi-Quellcode:
' '     : s1 := s1 + ' ';
in das CASE reinmach, dann bleibt das Leerzeichen erhalten.

nja, abgesehn, daß bei deiner Verschlüsselung die Berechnung nicht stimmte ... wie gesagt, du mußt auf den Wertebereich achten (also daß alles innerhalb der Buchstaben bleibt) und das Leerzeichen wird unverändert beibehalten.

kannst ja gern das Ergebnis deiner Funktion hiermit vergleichen
http://www.ivhp.de/files/caesar.htm
wenn das Selbe rauskommt, daß isses sozusagen richtig :stupid:
Delphi-Quellcode:
PROCEDURE TForm1.FormCreate(Sender: TObject);
VAR s, s1, aus: String;
    sch, i, ASCII: Integer;

BEGIN
  sch := StrToInt(lbein.text);
  s  := edein.Text;
  s1  := '';
  FOR i := 1 TO Length(s) DO
    CASE s[i] OF
      'A'..'Z' : s1 := s1 + s[i];
      'a'..'z' : s1 := s1 + UpCase(s[i]);
      'ß'     : s1 := s1 + 'SS';
      'ä', 'Ä' : s1 := s1 + 'AE';
      'ö', 'Ö' : s1 := s1 + 'OE';
      'ü', 'Ü' : s1 := s1 + 'UE';
      ' '     : s1 := s1 + ' ';
    END;
  aus := '';
  FOR i := 1 to Length(s1) DO
  BEGIN
    IF s1[i] <> ' ' THEN
    BEGIN
      ASCII := Ord(s1[i]) + sch;
      //WHILE ASCII > Ord('Z') DO ASCII := ASCII - 26;
      WHILE ASCII > Ord('Z') DO ASCII := ASCII - (Ord('Z') - Ord('A') + 1);
      aus := aus + Chr(ASCII);
    END
    ELSE
      aus := aus + s1[i];
  END;
  edaus.Text := aus;
END;

Snow Dragon 11. Feb 2009 12:31

Re: Leerzeichen in Unterstriche umwandeln
 
okay gut jetzt funktioniert alles, auch das verschlüsseln und die leerzeichen :-D danke an alle die mir geholfen haben


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 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 by Thomas Breitkreuz