我正在将一些遗留代码转换到Delphi 2010。
有相当数量的旧ShortStrings,比如string25
为什么下面的任务是:
type
S: String;
ShortS: String[25];
...
S := ShortS;
使编译器生成此警告:
W1057 Implicit string cast from 'ShortString' to 'string'.
这里没有发生数据丢失。在什么情况下,此警告对我有帮助?
谢谢!
Tomw
发布于 2010-01-23 07:59:08
ShortString类型未更改。实际上,它仍然是一个AnsiChar数组。
通过将其分配给字符串类型,您将获取一组AnsiChars (一个字节)并将其放入一组WideChars (两个字节)中。编译器可以很好地做到这一点,并且足够智能,不会丢失数据,但警告是为了让您知道已经发生了这样的转换。
发布于 2010-01-23 17:26:45
该警告非常重要,因为您可能会丢失数据。转换是使用当前Windows 8位字符集完成的,并且某些字符集没有定义0到255之间的所有值,或者是多字节字符集,因此无法转换所有字节值。
数据丢失可能发生在具有特定标准字符集的国家/地区的标准计算机上,也可能发生在为不同区域设置的美国计算机上,因为用户与使用其他语言的人进行了大量交流。
例如,如果本地代码页为932,则字节值129和130都将转换为Unicode字符串中的相同值。
除此之外,转换还涉及Windows API调用,这是一个开销很大的操作。如果你做了很多这样的事情,它可能会减慢你的应用程序。
发布于 2010-10-15 00:05:47
它是安全的(只要您使用ShortString的目的是:保存一个字符串,而不是一个字节集合,其中一些字节可能为0 ),但是如果您经常这样做,可能会影响性能。据我所知,Delphi必须为新的unicode字符串分配内存,将字符从ShortString提取到一个以null结尾的字符串中(这就是为什么它是一个格式正确的字符串很重要),然后调用类似Windows API MultiByteToWideChar()的函数。不是火箭科学,但也不是微不足道的操作。
https://stackoverflow.com/questions/2121265
复制相似问题