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
相关产品推荐
相关产品推荐

