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

标签 delphi delphi-10.4-sydney widechar

我在将编辑框中的文本转换为 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 函数支持使用美元符号表示法的十六进制。

关于delphi - 在 Delphi 中将 Widechar 代码点的十六进制字符串表示形式转换为 Widechar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67291163/

相关文章:

Delphi 11 Alexandria LSP代码补全问题

listview - 从内存中清除动态 FMX ListView 位图

delphi - 如何将包含 TPngImage 的 TImage 保存为位图文件?

delphi - 如何最大化表格到桌面大小?

winapi - WIN32 上的 struct __stat64 和 struct _stati64 有什么区别?

C++ 文件 IO : Reading and Writing 16-bit Words

delphi - 为什么TStringStream转换为字符串时不去掉BOM?

delphi - ZBar处理器和Delphi

delphi - 在 TScrollBox 中的固定位置保留位图

c++ - GetWindowTextW 无法获取宽字符串