2016-04-01 136 views
-1

我正在處理Ansi代碼字符串。我得到[32m, [37m, [K等字符。德爾福XE3 - 從字符串中刪除Ansi代碼/顏色

有沒有更快的方法來消除/剝離我得到的字符串的ansi代碼,而不是通過搜索ansi代碼的開始和結束點的字符串來循環執行?

我知道聲明是這樣的:#27'['#x';'#y';'#z'm'; 其中x,y,z ...是ANSI代碼。所以我認爲我應該尋找#27直到找到「m」

是否有任何已經制作的功能來實現我想要的功能?我的搜索沒有返回任何內容,除了this文章。 感謝

+0

的Telnet沒有顏色概念。您必須手動分析您正在接收的字符串。 –

+0

我其實並沒有在標題,問題或標籤中提及telnet。我只是解釋了我需要Ansi代碼解碼器的情況......;) –

+0

「*我建立了一個非常簡單的** telnet **客戶端來連接到接受** telnet **連接的特定設備*」 –

回答

2

你可以用這樣的代碼(最簡單的有限狀態機)非常快的把這個協議:從ESC碼

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 

結算字符串:

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

我實際上試圖從#27到m符號,即所有的ansi代碼,以獲得純粹可讀的字符串完全刪除的一切。單個字符串可以有多個代碼(又名綠色,紅色和藍色,用於其中的不同單詞),因此它需要遍歷它直到完成刪除ansi代碼。 你願意編輯答案來達到這個目的嗎?十分感謝! –

+1

添加簡單的例程爲Esc/m案例 – MBo

+0

完美!這完美無缺!非常感謝! :) –