如何在Delphi中将4字节UTF-8字符串转换为Unicode表情符号?
关于Delphi 10.3 UTF-8字节转可显示Emoji的解决方法
疑问解答
你当前拿到的字符串不是合法的Unicode字符串:本质是Web服务返回的UTF-8字节序列被错误地按单字节编码(如ANSI/ASCII)直接映射为了Delphi的宽字符,每个UTF-8字节被单独转换成了一个Unicode字符,所以显示为乱码。
转换操作步骤
- 第一步:将错误编码得到的乱码字符串还原为原始UTF-8字节数组
var Utf8Bytes: TBytes; RawStr: string; // 你从Web服务拿到的乱码字符串 i: Integer; begin RawStr := '你从Web接口获取的原始乱码字符串'; SetLength(Utf8Bytes, Length(RawStr)); for i := 0 to Length(RawStr) - 1 do Utf8Bytes[i] := Byte(RawStr[i+1]); // Delphi字符串默认采用1基索引
- 第二步:将UTF-8字节数组转换为合法Unicode字符串
var DecodedStr := TEncoding.UTF8.GetString(Utf8Bytes);
- 第三步:直接赋值给TMemo控件即可显示
Memo1.Text := DecodedStr; end;
简化写法
如果确认返回的所有内容都是UTF-8编码的字节映射结果,可以直接用类型转换实现一步转码:
var DecodedStr := string(UTF8String(RawStr));
注意:以上写法适配Delphi 2009及以后所有版本(包含10.3),如果转换后仍然显示方块占位符,请确认TMemo使用的字体支持Emoji渲染,推荐使用
Segoe UI Emoji字体。
内容的提问来源于stack exchange,提问作者JP_dev
相关产品推荐
相关产品推荐

