当前位置: 首页 > news >正文

Delphi经典8大天坑|第五篇:ShortString与String混用,导致字符串截断/乱码

一、现象描述

项目中同时使用ShortString和string两种字符串类型,赋值时出现字符串被莫名截断(超过255字符的部分丢失),或出现乱码,尤其是在Delphi D7及以下版本中,问题更常见。

典型场景:将一个长字符串(如300字符)赋值给ShortString变量,结果只保留前255个字符,后续字符被截断,且无任何报错提示。

二、根因深度解析

Delphi中有两种核心字符串类型,两者区别巨大,混用必然出问题:

  • ShortString:老式字符串,最大长度固定为255字符,存储时第一个字节记录字符串长度,后续存储字符;超过255字符的部分会被自动截断,且无任何提示;
  • string(动态字符串):Delphi默认字符串类型,长度无上限(仅受内存限制),自动管理内存,支持Unicode编码(Delphi 2009及以上)。

问题根源:将长string赋值给ShortString时,Delphi会自动截断超出255字符的部分,且不抛出任何异常,导致数据丢失;若将ShortString赋值给string,虽不会截断,但可能因编码问题出现乱码(尤其是非英文内容)。

三、错误代码(必踩示例)

delphi
procedure TForm1.Button1Click(Sender: TObject);
var
S1: ShortString; // 最大255字符
S2: string; // 无长度限制
begin
// S2是长字符串(300字符)
S2 := StringOfChar('A', 300);

// ❌ 错误:将长string赋值给ShortString,自动截断
S1 := S2;

// 输出长度为255,后续45个字符被截断,无任何提示
ShowMessage('S1长度:' + IntToStr(Length(S1))); // 输出255
end;

四、正确写法(100%生效)

核心原则:项目中**统一使用string类型**,彻底摒弃ShortString;若因兼容旧代码必须使用ShortString,需提前判断字符串长度,避免截断。

delphi
procedure TForm1.Button1Click(Sender: TObject);
var
S1: ShortString;
S2: string;
begin
S2 := StringOfChar('A', 300);

// ✅ 正确写法1:统一使用string,避免ShortString
// 注释掉ShortString,全部用string
// var S1: string;
// S1 := S2;
// ShowMessage('S1长度:' + IntToStr(Length(S1))); // 输出300

// ✅ 正确写法2:若必须用ShortString,提前判断长度
if Length(S2) <= 255 then
begin
S1 := S2;
end
else
begin
// 处理截断问题(提示用户、截取前255字符等)
ShowMessage('字符串过长,已截取前255字符');
S1 := Copy(S2, 1, 255);
end;
end;

五、避坑技巧

1. 新项目完全不用ShortString,所有字符串统一用string;

2. 旧项目若有ShortString,逐步替换为string,避免混用;

3. 若必须使用ShortString,任何赋值操作前,都要判断源字符串长度是否≤255,避免无声截断。

http://www.jsqmd.com/news/582684/

相关文章:

  • cv_unet_image-colorization图像上色入门必看:纯本地运行无网络依赖实操手册
  • 千问3.5-2B保姆级教程:网页端错误提示(fast path不可用等)含义与应对策略
  • Hyper-V设备直通图形化解决方案:让硬件性能释放不再复杂
  • 33、【Agent】【OpenCode】本地代理(智能适配层)
  • 2026卫生高级职称考试哪个题库好?教育博主实测3款热门题库榜单 - 医考机构品牌测评专家
  • Nunchaku-FLUX.1-dev开源镜像部署教程:免编译、免依赖、一键拉起服务
  • Pixel Aurora Engine应用场景:复古游戏机主题网站AI生成视觉系统集成
  • 实例 10:浮力与潜水艇模拟
  • PDFKit核心源码分析:揭秘HTML到PDF的转换魔法
  • 测试计划详细说明
  • **发散创新:基于Go语言的协同计算框架设计与实践**在现代分布式系统中,**
  • Lychee-Rerank+Qwen2.5-1.5B部署指南:纯本地检索重排序保姆级教程
  • ai辅助开发:智能诊断与生成个性化jdk配置方案的快马平台实践
  • nlp_gte_sentence-embedding_chinese-large模型在嵌入式Linux系统上的优化部署
  • cv_unet_image-colorization多分辨率适配实测:手机扫描件/胶片扫描图效果对比
  • OpenClaw安装碰到的一些问题和解决方法
  • 2026 年4月最新推荐:副主任医师备考机构口碑 Top 3 - 医考机构品牌测评专家
  • AI技术原理--AI Token是什么:10分钟搞懂大模型基础单位
  • 传奇游戏服务器搭建终极指南:OpenMir2从零到精通
  • BES-XGBoost多变量时间序列预测的‘秃鹰搜索优化算法‘与交叉验证抑制过拟合问题的Mat...
  • 高可用外卖返利 CPS 平台:Java 后端异步回调处理机制深度解析
  • 2026最新调研:主治医师最值得听的老师Top5榜单 - 医考机构品牌测评专家
  • 【WCH蓝牙系列芯片】-基于CH592开发板—利用SPI+DMA方式驱动WS2812
  • 如何用Umi-OCR实现隐私安全的离线文字识别?5大核心功能全解析
  • 科技信息最前沿202511——MATLAB Copilot
  • WCH 触摸上位机使用
  • windows系统IEDA构建maven工程编写HDFS或Mapreduce代码,打包jar到linux提交
  • 全国霸王餐 API 接口聚合平台,Java 后端多数据源路由策略设计
  • 驱动模块的加载与卸载机制
  • 008、队列(Queue):任务间通信的基石