在Delphi 2007中的字符串中插入表情符号

在Delphi 2007中的字符串中插入表情符号,delphi,delphi-2007,Delphi,Delphi 2007,我正试图做到标题所说的,在Delphi 2007中向字符串中插入表情符号,如下例所示: 程序TForm1.Button1单击发送者:对象; var-s:字符串; 开始 s:='这是我的原始字符串y'; 在Delphi2007中,默认的字符串类型是AnsiString。表情符号需要Unicode处理,因为它们使用的高Unicode代码点根本不适合/不存在于最常用的Ansi编码中。因此,您需要使用Unicode UTF编码,而不是UTF-7、-8、-16或-32 可以对UTF-71使用AnsiStr

我正试图做到标题所说的,在Delphi 2007中向字符串中插入表情符号,如下例所示:

程序TForm1.Button1单击发送者:对象; var-s:字符串; 开始 s:='这是我的原始字符串y';
在Delphi2007中,默认的字符串类型是AnsiString。表情符号需要Unicode处理,因为它们使用的高Unicode代码点根本不适合/不存在于最常用的Ansi编码中。因此,您需要使用Unicode UTF编码,而不是UTF-7、-8、-16或-32

可以对UTF-71使用AnsiString,对UTF-8使用UTF8String2,对UTF-16使用WideString,对UTF-32使用UCS4SSTRING3

1:UTF-7是一种7位ASCII兼容编码

2:UTF8String确实存在于Delphi 2007中,它是在Delphi 6中引入的,但它不是真正的UTF-8字符串类型,它只是AnsiString的别名,希望它始终保存UTF-8编码的数据。必须使用UTF8Encode和UTF8Decode,以确保通过UTF-16正确转换为其他编码。直到Delphi 2009 UTF8Encode和UTF8Decode也被弃用,UTF8String才成为真正的UTF-8字符串类型

3:UCS4String自Delphi6以来也存在,但即使在现代Delphi版本中,它也不是真正的字符串类型。它只是UCS4Char数组的别名

RTL对UTF-7没有任何本机支持,但手动实现并不困难,而且对UTF-32的支持也很少,只是为了方便UTF-16和UTF-32之间的转换,因此您应该在代码中使用UTF-8或UTF-16

如果将UTF数据转换为Ansi,例如将WideString传递给ShowMessage,则会丢失表情符号数据。您可以将WideString传递给Win32 API MessageBoxW函数,这样不会丢失任何数据,但是表情符号可能会正确显示,也可能不会正确显示,具体取决于对话框使用的字体,但至少不会显示为

然而,Delphi2007中的本地RTL根本不支持您正在尝试的内容,至少不支持UTF-16。您必须找到一个基于第三方WideString的函数,或者使用RTL的Pos、Delete和Insert内部函数编写自己的函数,这些函数对WideString数据重载,例如:

函数WideReplaceStrconst S,FromText,ToText:WideString:WideString; 变量 I:整数; 开始 结果:=S; 重复 I:=PosFromText,Result; 如果I=0,则断开; DeleteResult,I,Length fromText; InsertToText,Result,I; 直到错误; 终止 变量 s:宽弦; 开始 s:='这是我的原始字符串y';
s:=WideReplaceStrs,'y',@RemyLebeau谢谢。有没有类似于ansireplacestr的功能,可以在不丢失表情符号数据的情况下完成这项工作?@RemyLebeau我尝试过使用这些功能,但它们仍然用“?”替换表情符号。我刚刚用这种新方法编辑了我的问题。我发现很奇怪为什么人们会用减号标记一个问题,如果回答已经有+6分了……谢谢,我尝试了你的代码,在做了一些调整后,用“new:Widestring”替换了“To:Widestring”,不能使用“To”作为变量名,并添加了函数返回值,但它仍然用“??”取代了表情符号。delphirules:在我尝试时对我很好。为了更好的衡量,我甚至回到Delphi 7进行测试。@RemyLebeau:如果ToText碰巧包含FromText,WideReplaceStr不会陷入循环吗?@MartynA:可能吧。PosEx比Pos更好,只是它不支持WideString。AnsiReplaceStr只是StringReplace的包装,它也不支持WideString。这只是一个快速的演示,显然需要一个更适合生产的解决方案。我能告诉你的是,它对我来说很好。让我觉得你没有正确设置。至于WideChar值,