Delphi WideString和Delphi 2009+

Dav*_*vid 13 delphi unicode delphi-2010

我正在编写一个将宽字符串保存到二进制文件的类.我正在使用Delphi 2005,但该应用程序稍后将被移植到Delphi 2010.我在这里感到非常不确定,有人可以确认:

  1. 德尔福2005年WideString完全相同的同类型作为德尔福2010String

  2. Delphi 2005 WideStringchar和Delphi 2010 Stringchar保证总是 2字节大小.

有了所有的Unicode格式,我不希望被我的字符串中的一个字符突然变为3字节宽或类似的东西.

编辑:发现这个:"我确实说过UnicodeString,而不是WideString.WideString仍然存在,并且没有变化.WideString由Windows内存管理器分配,应该用于与COM对象交互.WideString直接映射到COM中的BSTR类型".http://www.micro-isv.asia/2008/08/get-ready-for-delphi-2009-and-unicode/

现在我更加困惑.那么Delphi 2010 WideString与Delphi 2005不一样WideString?我应该用UnicodeString吗?

编辑2:UnicodeString Delphi 2005中没有类型.FML.

Mas*_*ler 12

对于您的第一个问题: WideString与D2010的字符串类型不完全相同.WideString与其一直以来的COM BSTR类型相同.它由Windows管理,没有引用计数,因此每次将它传递到某处时它都会复制整个BSTR.

UnicodeString,这是D2009中的默认字符串类型,基本上是AnsiString我们都知道和喜爱的UTF-16版本.它有一个引用计数,由Delphi编译器管理.

对于第二种,char现在是默认类型WideChar,它们是一直使用的相同字符WideString.它是UTF-16编码,每个字符2个字节.如果将WideString数据保存到文件中,则可以UnicodeString毫无困难地加载它.这两种类型之间的区别与内存管理有关,而与数据格式无关.


klu*_*udg 1

  1. Delphi 2005 WideString 与 Delphi 2010 String 的类型完全相同

这不是真的 - ex Delphi 2010 字符串隐藏了内部代码页字段 - 但可能这对你来说并不重要。

  1. Delphi 2005 WideString char 以及 Delphi 2010 String char 保证其大小始终为 2 个字节。

那是真实的。在 Delphi 2010 中,SizeOf(Char) = 2(Char = WideChar)。


unicode 字符串不能有不同的代码页 - 引入代码页字段是为了为 Ansi 字符串(需要代码页字段)和 Unicode 字符串(不需要它)创建通用的二进制格式。

如果您将 WideString 数据保存到 Delphi 2005 中的流中,并在 Delphi 2010 中将相同的数据加载到字符串中,那么一切都应该可以正常工作。

WideString = BSTR 并且在 Delphi 2005 和 2010 之间没有改变

Delphi 2005 中的 UnicodeString = WideString (Delphi 2005 中是否存在 UnicodeString 类型 - 我不知道) Delphi 2009 及更高版本中的 UnicodeString = string。


@Marco - Delphi 2009+ 中的 Ansi 和 Unicode 字符串具有通用的二进制格式(12 字节标头)。

UnicodeString 代码页 CP_UTF16 = 1200;