将宽字符代码点的十六进制字符串表示形式转换为 Delphi 中的宽字符

Converting a hex string representation of a widechar codepoint to a widechar in Delphi

我在将编辑框中的文本转换为 WideChar 时遇到问题。这用于打印表情符号字符的代码。

如果我像下面这样手动设置 WideChar 值,它就可以工作

Emoji[1] := WideChar($D83D);
Emoji[2] := WideChar($DC4D);

但我希望能够通过如下编辑框设置十六进制代码

StringToWideChar(edit1.text, @wc1, Length(edit1.text));
StringToWideChar(edit2.text, @wc2, Length(edit2.text));
Emoji[1] := wc1;
Emoji[2] := wc2;

wc1 和 wc2 定义为 WideChar。编辑框包含与上面硬编码相同的值。该代码导致空白输出,因此转换有问题。

我做错了什么?感谢您的帮助。

您不能将字符串 '$D83D' 解释为文本 -- 相反,您必须将其解析为整数。

首先,您需要从编辑框中获取文本。这是Edit1.Text。然后您需要将其转换为整数。例如,您可以使用 StrToIntTryStrToInt。然后你只需要将这个整数重新解释(转换)为 Char:

procedure TForm1.Edit1Change(Sender: TObject);
var
  CodeUnit: Integer;
begin
  if TryStrToInt(Edit1.Text, CodeUnit) and InRange(CodeUnit, 0, $FFFF) then
    Label1.Caption := Char(CodeUnit)
  else
    Label1.Caption := '';
end;

在这里,作为奖励,我还使用 InRange 验证假定的代码单元是一个实际的 16 位无符号整数(我的意思是,用户理论上可以键入 123456789)。 Delphi 的 StrToInt 函数支持使用美元符号表示法的十六进制。