将宽字符代码点的十六进制字符串表示形式转换为 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
。然后您需要将其转换为整数。例如,您可以使用 StrToInt
或 TryStrToInt
。然后你只需要将这个整数重新解释(转换)为 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
函数支持使用美元符号表示法的十六进制。
我在将编辑框中的文本转换为 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
。然后您需要将其转换为整数。例如,您可以使用 StrToInt
或 TryStrToInt
。然后你只需要将这个整数重新解释(转换)为 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
函数支持使用美元符号表示法的十六进制。