我正在處理Ansi代碼字符串。我得到[32m, [37m, [K
等字符。德爾福XE3 - 從字符串中刪除Ansi代碼/顏色
有沒有更快的方法來消除/剝離我得到的字符串的ansi代碼,而不是通過搜索ansi代碼的開始和結束點的字符串來循環執行?
我知道聲明是這樣的:#27'['#x';'#y';'#z'm';
其中x,y,z ...是ANSI代碼。所以我認爲我應該尋找#27直到找到「m」
是否有任何已經制作的功能來實現我想要的功能?我的搜索沒有返回任何內容,除了this文章。 感謝
我正在處理Ansi代碼字符串。我得到[32m, [37m, [K
等字符。德爾福XE3 - 從字符串中刪除Ansi代碼/顏色
有沒有更快的方法來消除/剝離我得到的字符串的ansi代碼,而不是通過搜索ansi代碼的開始和結束點的字符串來循環執行?
我知道聲明是這樣的:#27'['#x';'#y';'#z'm';
其中x,y,z ...是ANSI代碼。所以我認爲我應該尋找#27直到找到「m」
是否有任何已經制作的功能來實現我想要的功能?我的搜索沒有返回任何內容,除了this文章。 感謝
你可以用這樣的代碼(最簡單的有限狀態機)非常快的把這個協議:從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;
我實際上試圖從#27到m符號,即所有的ansi代碼,以獲得純粹可讀的字符串完全刪除的一切。單個字符串可以有多個代碼(又名綠色,紅色和藍色,用於其中的不同單詞),因此它需要遍歷它直到完成刪除ansi代碼。 你願意編輯答案來達到這個目的嗎?十分感謝! –
添加簡單的例程爲Esc/m案例 – MBo
完美!這完美無缺!非常感謝! :) –
的Telnet沒有顏色概念。您必須手動分析您正在接收的字符串。 –
我其實並沒有在標題,問題或標籤中提及telnet。我只是解釋了我需要Ansi代碼解碼器的情況......;) –
「*我建立了一個非常簡單的** telnet **客戶端來連接到接受** telnet **連接的特定設備*」 –