Delphi中如何将SQL数据库的Unicode emoji编码转为TMemo可显示表情
Delphi中转换三种Unicode Emoji编码字符串为可显示表情的实现
实现思路
三种输入格式的核心都是UTF-8十六进制编码序列,只是包裹符号不同。我们需要:
- 过滤输入字符串,提取纯十六进制字符(0-9、A-F、a-f)
- 将十六进制字符序列转换为UTF-8字节数组
- 将UTF-8字节数组转换为Delphi的UnicodeString(TMemo支持的编码格式)
完整函数实现
function convert_as_Emoji(s: string): string; var HexStr: string; I: Integer; Bytes: TBytes; begin // 提取所有有效的十六进制字符 HexStr := ''; for I := 1 to Length(s) do begin if CharInSet(s[I], ['0'..'9', 'A'..'F', 'a'..'f']) then HexStr := HexStr + s[I]; end; // 校验十六进制字符串长度是否为偶数(每2个字符对应1个字节) if (Length(HexStr) mod 2) <> 0 then begin Result := ''; Exit; end; // 将十六进制字符串转换为UTF-8字节数组 SetLength(Bytes, Length(HexStr) div 2); for I := 0 to High(Bytes) do begin Bytes[I] := StrToInt('$' + Copy(HexStr, I*2 + 1, 2)); end; // 将UTF-8字节数组转换为UnicodeString(TMemo可直接显示) try Result := TEncoding.UTF8.GetString(Bytes); except // 转换失败时返回空字符串,可根据需求调整为原输入或其他值 Result := ''; end; end;
测试示例
var s1, s2, s3: string; begin s1 := '$F09F998A'; // 连续$开头格式 s2 := '$F0 $9F $99 $8A'; // 空格分隔的$开头格式 s3 := '\xF0\x9F\x99\x8A'; // \x转义格式 Memo1.Lines.Add(convert_as_Emoji(s1)); // 显示🙊 Memo1.Lines.Add(convert_as_Emoji(s2)); // 显示🙊 Memo1.Lines.Add(convert_as_Emoji(s3)); // 显示🙊 end;
注意事项
- 该函数适用于Delphi 2009及以上版本(支持UnicodeString和TEncoding)
- 若输入的十六进制序列不是有效的UTF-8编码,函数会返回空字符串,可根据业务需求修改错误处理逻辑
- TMemo需确保使用默认的Unicode编码(Delphi默认配置即可)
内容的提问来源于stack exchange,提问作者Ingo
相关产品推荐
相关产品推荐

