Delphi WideString和Delphi 2009+
我正在写一个将宽字符串保存为二进制文件的类。 我为此使用Delphi 2005,但该应用稍后将移植到Delphi 2010中。我在这里感觉非常不确定,有人可以确认:
Delphi 2005 WideString
与Delphi 2010 String
完全一样
Delphi 2005 WideString
字符以及Delphi 2010 String
char保证始终为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: Delphi 2005中没有UnicodeString
类型UnicodeString
。
对于第一个问题: WideString
与D2010的字符串不完全一样。 WideString与它一直是COM BSTR类型相同。 它由Windows管理,没有引用计数,所以每当你将它传递到某个地方时,它会复制整个BSTR。
UnicodeString
,这是D2009和之后的默认字符串类型,基本上是我们都知道并喜爱的一个UTF-16版本的AnsiString
。 它有一个引用计数并由Delphi编译器管理。
对于第二种,默认的char
类型现在是WideChar
,它们是在WideString
一直使用的相同字符。 这是一个UTF-16编码,每个字符2个字节。 如果将WideString数据保存到文件中,则可以毫无困难地将其加载到UnicodeString
。 这两种类型的区别与内存管理有关,而不是数据格式。
正如其他人所提到的,Delphi 2009及更高版本中的字符串(实际上是UnicodeString)数据类型与先前版本中的WideString数据类型不同,但数据内容格式相同。 它们都以UTF-16格式保存字符串。 因此,如果您在早期版本的Delphi中使用WideString保存文本,则应该能够在最新版本的Delphi(2009及更高版本)中使用字符串数据类型正确读取它。
你应该注意到UnicodeString的性能比WideString的性能要好。 因此,如果您要在Delphi 2005和Delphi 2010中使用相同的源代码,我建议您在代码中使用带条件编译的字符串类型别名,以便您可以拥有两全其美的优点:
type
{$IFDEF Unicode}
MyStringType = UnicodeString;
{$ELSE}
MyStringType = WideString;
{$ENDIF}
现在,您可以在源代码中使用MyStringType作为字符串类型。 如果编译器是Unicode的(Delphi 2009及以上版本),那么你的字符串类型就是UnicodeString类型的别名,它在Delphi 2009中引入来保存Unicode字符串。 如果编译器不是unicode(例如Delphi 2005),那么你的字符串类型将是旧的WideString数据类型的别名。 由于它们都是UTF-16,所以任何版本保存的数据都应该被另一个版本正确读取。
这是不正确的 - 从Delphi 2010字符串中隐藏了内部代码页字段 - 但可能对您无关紧要。
那是真实的。 在Delphi 2010中SizeOf(Char)= 2(Char = WideChar)。
unicode字符串不能有不同的代码页 - 引入代码页字段为Ansi字符串(需要代码页字段)和Unicode字符串(不需要它)创建一个通用的二进制格式。
如果您在Delphi 2005中保存WideString数据以进行流式处理,并在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 codepage CP_UTF16 = 1200;
链接地址: http://www.djcxy.com/p/61487.html