如何生成与 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;
规则很简单:
- 非控制字符的运行由撇号包围。
- 此类运行中的撇号被转义。
- 控制字符写为十六进制转义。
- 空字符串为
''
。
我需要生成在对字符串值调用 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;
规则很简单:
- 非控制字符的运行由撇号包围。
- 此类运行中的撇号被转义。
- 控制字符写为十六进制转义。
- 空字符串为
''
。