【问题标题】:Delphi XE3 - Remove Ansi Code / Color from stringDelphi XE3 - 从字符串中删除 Ansi 代码/颜色
【发布时间】:2016-07-21 14:15:21
【问题描述】:

我正在努力处理 Ansi 代码字符串。我得到了[32m, [37m, [K 等字符。

有没有一种更快的方法来消除/去除我得到的字符串中的 ansi 代码,而不是通过字符循环搜索 ansi 代码的起点和终点?

我知道声明是这样的:#27'['#x';'#y';'#z'm'; 其中 x, y, z... 是 ANSI 代码。所以我假设我应该搜索#27,直到找到“m;”

是否有任何已经实现的功能来实现我想要的?除了this 文章,我的搜索没有返回任何内容。 谢谢

【问题讨论】:

  • Telnet 没有颜色的概念。您必须手动解析收到的字符串。
  • 我实际上并没有在标题、问题和标签中提到 telnet。我刚刚解释了我需要 Ansi 代码解码器的情况...... ;)
  • "我构建了一个非常简单的 telnet 客户端来连接到接受 telnet 连接的特定设备"
  • ... -> “但它适用于 ansi 颜色编码的字符串......所以我在 telnet 缓冲区中获取 xyz 字符......有没有更快的方法从我得到的字符串中消除/剥离 ansi 代码(或直接缓冲)..." ;) 如前所述,我只是解释了我在做什么,所以很清楚代码在哪里。另外,只是因为 Telnet 组件内部可能有一些我不知道的解析器,所以..
  • Ps:刚刚编辑了问题,省略了 Telnet 部分,如果这很重要的话。

标签: delphi ansi ansi-colors


【解决方案1】:

您可以使用这样的代码(最简单的有限状态机)非常快速地处理此协议:

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

从 ESC 代码中清除字符串:

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 案例添加了简单的例程
猜你喜欢
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 2020-01-04
  • 2015-05-28
相关资源
最近更新 更多