2016-04-01 7 views
-1

Ich habe Probleme mit dem Umgang mit Ansi-Code-Strings. Ich bekomme die [32m, [37m, [K etc Zeichen.Delphi XE3 - Entfernen Ansi-Code/Farbe aus String

Gibt es eine schnellere Möglichkeit, die ANSI-Codes aus den Strings, die ich bekomme, zu entfernen/strippen, anstatt es mit den Schleifen zu machen, die nach den Anfangs- und Endpunkten der ANSI-Codes suchen?

Ich weiß die Deklaration ist in etwa so: #27'['#x';'#y';'#z'm'; wo x, y, z ... sind die ANSI-Codes. Ich nehme an, ich sollte nach # 27 suchen, bis ich "m" finde.

Gibt es irgendwelche bereits gemachten Funktionen, um das zu erreichen, was ich will? Meine Suche ergab nichts außer this Artikel. Dank

+0

Telnet hat kein Konzept von Farben . Sie müssen die empfangenen Zeichenfolgen manuell analysieren. –

+0

Ich habe Telnet weder in Titel, Frage noch Tags erwähnt. Ich habe gerade den Fall erklärt, wo ich den Ansi-Code-Decoder brauche ...;) –

+0

"* Ich habe einen sehr einfachen ** telnet ** -Client gebaut, um eine Verbindung zu einem bestimmten Gerät herzustellen, das ** telnet ** -Verbindungen akzeptiert *" –

Antwort

2

Sie dieses Protokoll sehr schnell mit Code wie folgt (einfachste Finite State Machine) behandeln:

var 
    s: AnsiString; 
    i: integer; 
    InColorCode: Boolean; 
begin 
    s := 'test'#27'['#5';'#30';'#47'm colored text'; 

    InColorCode := False; 

    for i := 1 to Length(s) do 
    if InColorCode then 
     case s[i] of 
      #0: TextAttrib = Normal; 
      ... 
      #47: TextBG := White; 
      'm': InColorCode := false; 
     else; 
     // I do nothing here for `;`, '[' and other chars. 
     // treat them if necessary 

     end; 
    else 
     if s[i] = #27 then 
     InColorCode := True 
     else 
     output char with current attributes 

Clearing-String aus ESC-Codes:

procedure StripEscCode(var s: AnsiString); 
const 
    StartChar: AnsiChar = #27; 
    EndChar: AnsiChar = 'm'; 
var 
    i, cnt: integer; 
    InEsc: Boolean; 
begin 
    Cnt := 0; 
    InEsc := False; 
    for i := 1 to Length(s) do 
    if InEsc then begin 
     InEsc := s[i] <> EndChar; 
     Inc(cnt) 
    end 
    else begin 
     InEsc := s[i] = StartChar; 
     if InEsc then 
     Inc(cnt) 
     else 
     s[i - cnt] :=s[i]; 
    end; 
    setLength(s, Length(s) - cnt); 
end; 
+0

Ich versuche tatsächlich, alles von # 27 bis zum m-Zeichen, aka alle ansi-Codes, vollständig zu entfernen, um eine reine lesbare Zeichenfolge zu erhalten. Und eine einzelne Zeichenfolge kann mehrere Codes haben (aka Farbe grün, rot und blau, für verschiedene Wörter darin), so dass es durchlaufen muss, bis es fertig ist, die ANSI-Codes zu entfernen. Würdest du freundlich genug sein, die Antwort zu bearbeiten, um das zu erreichen? Vielen Dank! –

+1

Hinzugefügt einfache Routine für Esc/m Fall – MBo

+0

Perfekt !!! Das funktioniert einwandfrei !!! Danke vielmals! :) –