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

Delphi 12中字符串附加的部分非ASCII Unicode符号消失原因及解决办法

Delphi 12中Unicode字符在字符串字面量中丢失的问题分析与解决

问题现象

升级至Delphi 12后,出现两处Unicode字符显示异常:

  • 图像查看器右键菜单中,带U+2212减号的“Zoom out”菜单项完全消失
  • 另一应用的列表框内,末尾的笔图标(✏)缺失

对应代码片段:

FmiZoomOut.Caption := 'Zoom out'#9'−'; // U+2212: MINUS SIGN
Item.Caption := FInbox[Item.Index].Name +
  IfThen(not FInbox[Item.Index].Note.IsEmpty, #32#32#32'✏');

可通过以下代码在VCL新应用的窗体OnCreate事件中重现问题:

ShowMessage('Snowman:'#32'☃');

成因分析

Delphi 12对字符串字面量的解析逻辑发生了变更:当代码中使用#nn'x'格式(x为非ASCII Unicode字符)时,编译器错误地将#nn后的Unicode字符按单字节ASCII字符处理,导致Unicode字符被截断或损坏,最终引发控件内容丢失或字符不显示。

可行解决办法

  • 拆分字符串拼接:将#nn与Unicode字符的混合写法拆分为字符串拼接,例如把'Zoom out'#9'−'改为'Zoom out' + #9 + '−'
  • 使用十六进制转义表示Unicode字符:用#$XXXX格式替代直接写入Unicode字面量,比如U+2212减号可写为#$2212,☃雪人图标可写为#$2603,修改后的代码示例:
    FmiZoomOut.Caption := 'Zoom out'#9#$2212;
    ShowMessage('Snowman:'#32#$2603);
    
  • 直接写入完整Unicode字符串:将包含控制符和Unicode字符的内容直接作为完整字符串常量定义,避免混合#nn写法,例如:
    const
      cZoomOutCaption = 'Zoom out	−'; // 直接包含制表符和U+2212减号
    begin
      FmiZoomOut.Caption := cZoomOutCaption;
    end;
    
  • 确认项目编码设置:检查项目编译选项,确保Project Options > Building > Delphi Compiler > Compiling > Character set设置为UTF-8,保证编译器正确处理Unicode字符串。

内容的提问来源于stack exchange,提问作者Andreas Rejbrand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:03:29