将 SysUtils.WrapText() 与包含单引号的字符串一起使用

Using SysUtils.WrapText() with strings containing single quotes

我正在尝试将 SysUtils.WrapText() 函数与包含转义单引号字符的字符串一起使用,但我得到了意外结果。

var
  Lines : TStrings;
begin
  Lines := TStringList.Create;
  try
    Lines.Text := WrapText('Can''t format message, message file not found', 15);
    ShowMessage(Lines.Text);
  finally
    Lines.Free;
  end;
end;

如果字符串包含撇号字符,该函数似乎根本不会换行。

我也试过使用 #39 代码而不是单引号字符,但问题仍然存在。此外,我检查了 Lines.Count,它是 1

我试过删除单引号字符:

var
  Lines : TStrings;
begin
  Lines := TStringList.Create;
  try
    Lines.Text := WrapText('Cant format message, message file not found', 15);
    ShowMessage(Lines.Text);
  finally
    Lines.Free;
  end;
end;

它开始按预期包装字符串:

我想知道为什么会这样,我应该如何对此类字符串使用 WrapText() 函数?

在 10.3.1 中,源代码包含处理引号字符(双引号和单引号)的代码,看起来只是忽略它们之间的文本。因此,一种解决方案是使用不同于单引号字符的撇号。第二个是避免使用收缩。函数源的开始:

function WrapText(const Line, BreakStr: string; const BreakChars: TSysCharSet;
  MaxCol: Integer): string;
const
  QuoteChars = ['''', '"'];
  FirstIndex = Low(string);
  StrAdjust = 1 - Low(string);
var
...

一个选项:

    Lines.Text := WrapText('Can`t format message, message file not found', 15);

第二个选项:

    Lines.Text := WrapText('Cannot format message, message file not found', 15);

您描述的是故意行为

在 Delphi XE 和更早版本中,WrapText() documentation 包含以下语句:

WrapText does not insert a break into an embedded quoted string (both single quotation marks and double quotation marks are supported).

在 Delphi XE2 之后的版本中,文档中省略了该语句,但该行为仍在 RTL 中实现。

我已就此遗漏向 Embarcadero 开具工单:

RSP-24114: Important clause about embedded quoted strings is missing from WrapText documentation