如何在 Delphi 备忘录上进行 Unicode 装饰

del*_*les 4 delphi delphi-10.3-rio

我有一个小型的 Delphi 10.3.3 应用程序,它具有一些文本编辑功能,使用用户键入文本的 TMemo。

我试图包含一些格式选项,如本网站提供的:

http://qaz.wtf/u/convert.cgi?text=How%20do%20it%20on%20Delphi

当我从上面的网站复制“圈出”文本并粘贴到我的备忘录上时,它起作用了,显示“圈出”。但我想让我的用户能够在我的应用程序中应用格式。

例如,我想要一个快速按钮将“圆形”格式应用于当前 TMemo 所选文本:用户选择一个文本,单击此快速按钮,然后所选文本将获得“圆形”格式。

在此输入图像描述

And*_*and 5

这相当容易。如果您查看所附字母数字的 Unicode 图表,您会发现以下映射是有效的:

function EncircleChr(AChr: Char): Char;
begin
  case AChr of
    '0':
      Result := Chr($24EA);
    '1'..'9':
      Result := Chr($2460 + Ord(AChr) - Ord('1'));
    'a'..'z':
      Result := Chr($24D0 + Ord(AChr) - Ord('a'));
    'A'..'Z':
      Result := Chr($24B6 + Ord(AChr) - Ord('A'));
  else
    Result := AChr;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

因此,与

function Encircle(const S: string): string;
var
  i: Integer;
begin
  SetLength(Result, S.Length);
  for i := 1 to S.Length do
    Result[i] := EncircleChr(S[i]);
end;
Run Code Online (Sandbox Code Playgroud)

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.SelText := Encircle(Memo1.SelText);
end;
Run Code Online (Sandbox Code Playgroud)

你会得到想要的行为:

TMemo 的屏幕截图,其中字母和数字已转换为带圆圈的版本。

  • @delphirules:超出 BMP 的字符表示为两个 Delphi 字符(代理对)。因此,您需要一个 Delphi 字符串来表示这样的字符。您可以通过执行“Char.ConvertFromUtf32($1F17F)”等操作来获得这样的字符串。 (5认同)
  • @delphirules:Delphi的字符类型是两个字节宽(=四个十六进制数字),因此它仅支持[BMP](https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_Multilingual_Plane)。就我个人而言,我尽量避免使用 BMP 之外的字符,因为它们不太容易使用。此外,无论如何,很少有字体具有 BMP 之外的字符字形...... (2认同)