You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中如何将SQL数据库的Unicode emoji编码转为TMemo可显示表情

Delphi中转换三种Unicode Emoji编码字符串为可显示表情的实现

实现思路

三种输入格式的核心都是UTF-8十六进制编码序列,只是包裹符号不同。我们需要:

  1. 过滤输入字符串,提取纯十六进制字符(0-9、A-F、a-f)
  2. 将十六进制字符序列转换为UTF-8字节数组
  3. 将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:45:19