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 |
四、正确写法(100%生效)
核心原则:项目中**统一使用string类型**,彻底摒弃ShortString;若因兼容旧代码必须使用ShortString,需提前判断字符串长度,避免截断。
delphi |
五、避坑技巧
1. 新项目完全不用ShortString,所有字符串统一用string;
2. 旧项目若有ShortString,逐步替换为string,避免混用;
3. 若必须使用ShortString,任何赋值操作前,都要判断源字符串长度是否≤255,避免无声截断。
