首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么Delphi在将ShortString赋值给字符串时会发出警告?

为什么Delphi在将ShortString赋值给字符串时会发出警告?
EN

Stack Overflow用户
提问于 2010-01-23 07:28:26
回答 5查看 19.4K关注 0票数 20

我正在将一些遗留代码转换到Delphi 2010。

有相当数量的旧ShortStrings,比如string25

为什么下面的任务是:

代码语言:javascript
复制
type 
  S: String;
  ShortS: String[25];

...
S := ShortS;

使编译器生成此警告:

代码语言:javascript
复制
W1057 Implicit string cast from 'ShortString' to 'string'.

这里没有发生数据丢失。在什么情况下,此警告对我有帮助?

谢谢!

Tomw

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-23 07:59:08

ShortString类型未更改。实际上,它仍然是一个AnsiChar数组。

通过将其分配给字符串类型,您将获取一组AnsiChars (一个字节)并将其放入一组WideChars (两个字节)中。编译器可以很好地做到这一点,并且足够智能,不会丢失数据,但警告是为了让您知道已经发生了这样的转换。

票数 15
EN

Stack Overflow用户

发布于 2010-01-23 17:26:45

该警告非常重要,因为您可能会丢失数据。转换是使用当前Windows 8位字符集完成的,并且某些字符集没有定义0到255之间的所有值,或者是多字节字符集,因此无法转换所有字节值。

数据丢失可能发生在具有特定标准字符集的国家/地区的标准计算机上,也可能发生在为不同区域设置的美国计算机上,因为用户与使用其他语言的人进行了大量交流。

例如,如果本地代码页为932,则字节值129和130都将转换为Unicode字符串中的相同值。

除此之外,转换还涉及Windows API调用,这是一个开销很大的操作。如果你做了很多这样的事情,它可能会减慢你的应用程序。

票数 7
EN

Stack Overflow用户

发布于 2010-10-15 00:05:47

它是安全的(只要您使用ShortString的目的是:保存一个字符串,而不是一个字节集合,其中一些字节可能为0 ),但是如果您经常这样做,可能会影响性能。据我所知,Delphi必须为新的unicode字符串分配内存,将字符从ShortString提取到一个以null结尾的字符串中(这就是为什么它是一个格式正确的字符串很重要),然后调用类似Windows API MultiByteToWideChar()的函数。不是火箭科学,但也不是微不足道的操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2121265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档