如何生成与 Evaluate\Modify 对话框转义相同的 Delphi 字符串文字?

How can I generate a Delphi string literal escaped the same as the Evaluate\Modify dialog?

我需要生成在对字符串值调用 IDE 的 Evaluate\Modify 时显示的字符串。 window中显示的字符串可以直接在Delphi代码中使用。

我正在将字符串常量文字写入 Delphi 代码中使用的包含文件。

这些字符串常量包含可打印、不可打印的字符,我也有 $80-$A0 范围内的字符,其中 WideString 和 AnsiString 序数不匹配(例如 Assert(Char(#) <> Char(#[=13=]96)),即使 Assert( = [= 14=]96)).我可以让我的常量全部转义字符,但这会影响其余文本的可读性。

这是一个例示问题字符串的制造案例。您可以看到 Evaluate\Modify 正确处理了问题案例,同时将可打印部分保留为带引号的字符串。

const 
  AString: String  = 'W'#[=12=]96'~ '#C;

请注意,QuotedString 无法工作。它不会生成表示转义序列的字符串,它只会引用字符串并且将转义序列作为它们表示的实际字符。这里的目标是生成一个可以在代码中使用的字符串。

这与 IDE 的实现不完全匹配,但应该是一个非常好的开始:

function MakeStringLiteral(const AString: string): string;
begin
  var InText := False;
  Result := '';
  for var c in AString do
    if C.IsControl then
    begin
      if InText then
      begin
        Result := Result + '''';
        InText := False;
      end;
      Result := Result + '#$' + IntToHex(Ord(C));
    end
    else
    begin
      if not InText then
        Result := Result + '''';
      Result := Result + C;
      if C = '''' then
        Result := Result + '''';
      InText := True;
    end;
  if InText then
    Result := Result + '''';
  if Result.IsEmpty then
    Result := '''''';
end;

规则很简单:

  1. 非控制字符的运行由撇号包围。
  2. 此类运行中的撇号被转义。
  3. 控制字符写为十六进制转义。
  4. 空字符串为''