如何在Delphi的TLabel.Caption中显示UTF-32的U+1F4CD圆形图钉
解决Delphi TLabel显示Emoji(U+1F4CD图钉)为方块的问题
我来帮你搞定这个头疼的Emoji显示问题!你看到的怪异方块,核心原因是TLabel默认使用的字体不支持这个Emoji字符,再加上Unicode字符在Delphi里的处理细节没踩对。下面是一步步的解决方案:
1. 优先设置支持Emoji的字体
这是最常见的解决办法,Windows系统自带了几个支持Emoji的字体,直接给TLabel指定就行:
- 对于Windows 10及以上,用
Segoe UI Emoji(专门为Emoji设计的字体,显示效果最好) - 也可以用
Segoe UI Symbol或者Noto Color Emoji(需要单独安装后者)
在代码里设置的方式:
lblLocation.Font.Name := 'Segoe UI Emoji'; // 可以顺便调大字体,让Emoji显示更清晰 lblLocation.Font.Size := 12;
2. 正确赋值Unicode字符
你的ConvertFromUtf32思路是对的,但要注意Delphi版本的Unicode支持:
- Delphi 2009及以上(原生支持UnicodeString):
除了用ConvertFromUtf32,还可以直接用代理对拼接(因为U+1F4CD是4字节Unicode,在UTF-16里拆分为两个代理字符D83D和DCCD):// 方式1:直接用ConvertFromUtf32 lblLocation.Caption := ConvertFromUtf32($1F4CD) + ' Pretoria, South Africa'; // 方式2:用UTF-16代理对 lblLocation.Caption := #$D83D#$DCCD + ' Pretoria, South Africa'; // 方式3:直接粘贴Emoji字符(前提是源码文件为UTF-8编码) // 记得在Delphi的Project Options -> Compiler -> Source encoding设置为UTF-8 lblLocation.Caption := '📍 Pretoria, South Africa'; - Delphi 2009之前的版本(仅支持ANSI String):
这时候TLabel的Caption是AnsiString,得用WideString结合Windows API来设置:var WideCaption: WideString; begin WideCaption := WideString('📍 Pretoria, South Africa'); // 直接通过API设置窗口文本 SetWindowTextW(lblLocation.Handle, PWideChar(WideCaption)); // 或者用ConvertFromUtf32的WideString版本 WideCaption := WideString(ConvertFromUtf32($1F4CD)) + ' Pretoria, South Africa'; SetWindowTextW(lblLocation.Handle, PWideChar(WideCaption)); end;
3. 排查系统层面的问题
如果设置字体后还是显示方块,先在系统记事本里输入这个Emoji看看:
- 如果记事本也显示方块,说明你的Windows系统缺少支持Emoji的字体:
- Win10+可以通过Windows Update自动获取字体;
- Win7需要手动安装
Segoe UI Emoji字体补丁,或者安装第三方Emoji字体比如Noto Color Emoji。
4. 小测试技巧
- 把TLabel的
AutoSize设为True,确保控件足够大容纳Emoji; - 暂时关闭TLabel的
Transparent属性,有时候透明渲染会影响特殊字符显示。
内容的提问来源于stack exchange,提问作者user12135943
相关产品推荐
相关产品推荐

