AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Wie entferne ich Steuerzeichen aus einem String?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie entferne ich Steuerzeichen aus einem String?

Ein Thema von Der schöne Günther · begonnen am 8. Apr 2015 · letzter Beitrag vom 9. Apr 2015
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.155 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Wie entferne ich Steuerzeichen aus einem String?

  Alt 8. Apr 2015, 19:31
Delphi-Version: XE7
Hallo, mein Name ist Günther und ich programmiere nun seit etwas über zwei Jahren in Delphi. Heute stehe ich vor einem schwierigen Problem. Ich möchte bestimmte Character (wie #0 ) aus einem String entfernen.

Ich dachte, ich mache es so:
Delphi-Quellcode:
uses System.SysUtils;

procedure justReplaceThings();
const
   STX = #02;
   ETX = #03;
   NUL = #00;

   myStr   =   'X'+STX+'Hallo '+NUL+'Welt'+ETX;
var
   cleanedStr:   String;
begin
   cleanedStr := myStr.Replace(NUL, EmptyStr);
   Assert( cleanedStr <> myStr );
end;
Aber leider funktioniert das nicht, da kommt so eine komische Fehlermeldung. Könnt ihr mir helfen? Ist bestimmt voll einfach, aber ich bin noch neu
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.016 Beiträge
 
Delphi 12 Athens
 
#2

AW: Wie entferne ich Steuerzeichen aus einem String?

  Alt 8. Apr 2015, 19:40
Komisch?

Man mag es nicht glauben, aber Strg+C funktioniert auch in Delphi-Dialogen. (und dann Strg+V als Text ins Forum)
Du meinst aber nicht zufällig sowas, wie Folgendes?
Zitat:
---------------------------
Project3
---------------------------
Assertion fehlgeschlagen (C:\Users\Frank\Documents\Embarcadero\Studio\Proje kte\Unit3.pas, Zeile 36)
---------------------------
OK
---------------------------



Die Frage könnte aber auch lauten: "Wie kommen denn böse Steuerzeichen in den String rein"?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Apr 2015 um 19:46 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Wie entferne ich Steuerzeichen aus einem String?

  Alt 8. Apr 2015, 19:43
Zitat:
Die Frage könnte aber auch lauten: "Wie kommen denn böse Steuerzeichen in den String rein"?
In dem man sie absichtlich einbaut ?

LOL

gruss
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.155 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Wie entferne ich Steuerzeichen aus einem String?

  Alt 8. Apr 2015, 19:45
Wie da hineinkommen weiß ich auch nicht, der entsprechende Programmierer ist schon nach Hause gegangen. Kann ich bei dem Wetter auch verstehen.

Die eigentliche Frage Warum werden die Zeichen nicht entfernt? bleibt aber bestehen. Steppe ich durch den entsprechenden RTL-Code verlässt mich spätestens bei
Delphi-Quellcode:
if (Str1[I] <> #0) and (StrLComp(PWideChar(PByte(Str1) + I * SizeOf(WideChar)), Str2, Len2) = 0) then
    begin
      Result := PWideChar(PByte(Str1) + I * SizeOf(WideChar));
die Lust...

Geändert von Der schöne Günther ( 8. Apr 2015 um 19:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.016 Beiträge
 
Delphi 12 Athens
 
#5

AW: Wie entferne ich Steuerzeichen aus einem String?

  Alt 8. Apr 2015, 19:53
Sag das doch gleich.

Irgendwer ist vor Jahren auf die wirkich saublöde Idee gekommen und verwendet in StringReplace das Delphi-Referenz durchsuchenAnsiPos, welches im Windows wiederum das MSDN-Library durchsuchenStrPosLen (PChar) benutzt, anstatt Delphi-Referenz durchsuchenPos zu verwenden.

Jetzt rate mal, was der Unterschied zwischen einem Delphi-String mit Längenangabe und einem Windows-PChar mit Endezeichen ist und was dann passiert, wenn ein gewisses böses Steuerzeichen im String vor kommt.
Der Bug wurde schon vor sehr vielen Jahren gemeldet ... ich würde nicht mehr mit einem Bugfix rechnen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.155 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Wie entferne ich Steuerzeichen aus einem String?

  Alt 8. Apr 2015, 19:58
Das heißt mit allem außer #0 sollte es funktionieren?
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Wie entferne ich Steuerzeichen aus einem String?

  Alt 8. Apr 2015, 20:37
Würde ich mal so annehmen. Auch absolute Neulinge können es übrigens ausprobieren. Aber dazu müssten sie Programmieren können.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.155 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Wie entferne ich Steuerzeichen aus einem String?

  Alt 8. Apr 2015, 20:44
Delphi-Quellcode:
uses System.SysUtils;

procedure justReplacingThings();
const
   formatStr = 'Hallo%sWelt';
var
   dirtyString:   String;
   cleanedString:   String;
   badCharacter:   Char;
   charsTested:   Integer;
begin
   charsTested := 0;
   for badCharacter := Low(Char) to High(Char) do begin
      dirtyString := String.Format(formatStr, [badCharacter]);
      cleanedString := dirtyString.Replace(badCharacter, EmptyStr);
      if not (dirtyString <> cleanedString) then
         WriteLn('Removing Character #', Ord(badCharacter), ' failed');
      Inc(charsTested);
   end;

   WriteLn(charsTested, ' Characters tested');
end;
ergibt
Code:
Removing Character #0 failed
65536 Characters tested
Dann kann ich ja wieder ruhig schlafen.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

AW: Wie entferne ich Steuerzeichen aus einem String?

  Alt 9. Apr 2015, 02:03
Na zum Glück haben wir die Tage ja eine performante Funktion gebastelt, die beliebige Zeichen aus einem String entfernen kann:
http://www.delphipraxis.net/184473-s...ml#post1295287
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

AW: Wie entferne ich Steuerzeichen aus einem String?

  Alt 9. Apr 2015, 07:28
Dann kann ich ja wieder ruhig schlafen.
Sicher? Ich hätte bei dem Test noch sichergestellt, das der 'badCharacter' auch wirklich im 'dirtyString' enthalten ist.
Könnte ja sein, das irgend ein Zeichen per 'Format' nicht übernommen wird. Dann meckert dein Code auch nicht.
Delphi-Quellcode:
procedure justReplacingThings();
const
   formatStr = 'Hallo%sWelt';
var
   dirtyString: String;
   cleanedString: String;
   badCharacter: Char;
   charsTested: Integer;
begin
   charsTested := 0;
   for badCharacter := Low(Char) to High(Char) do begin
      dirtyString := String.Format(formatStr, [badCharacter]);
      if not ContainsChar(dirtyString, badCharacter) then // <-----
        writeln('Format fails for #', ord(basCharacter))
      else begin
        cleanedString := dirtyString.Replace(badCharacter, EmptyStr);
        if not (dirtyString <> cleanedString) then
           WriteLn('Removing Character #', Ord(badCharacter), ' failed');
      end;
      Inc(charsTested);
   end;

   WriteLn(charsTested, ' Characters tested');
end;
Und dann 'ContainsChar' ohne API implementieren (d.h. kein POS o.ä.).
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 09:32 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