我正在编写一个将宽字符串保存到二进制文件中的类。我正在使用Delphi 2005实现这一点,但应用程序稍后将被移植到Delphi 2010。我在这里很不确定,有人能证实一下吗:
Delphi 2005 String
WideString与Delphi2010 Delphi 2005 WideString char类型完全相同,而Delphi 2010 WideString 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/
现在我更困惑了。那么德尔福2010的WideString和德尔福2005的WideString不一样吗?我应该用UnicodeString代替吗?
编辑2:在Delphi2005中没有UnicodeString类型。FML。
发布于 2010-11-04 12:46:48
关于您的第一个问题:WideString与D 2010的字符串不完全相同。WideString是与以前一样的COM类型。它是由Windows管理的,没有引用计数,所以每次您在某个地方传递BSTR时,它都会复制整个BSTR。
UnicodeString是D2009和on中默认的字符串类型,它基本上是我们都知道和喜欢的AnsiString的UTF-16版本。它有一个引用计数,由Delphi编译器管理。
对于第二个类型,默认的char类型现在是WideChar,它与WideString中一直使用的字符相同。它是一个UTF-16编码,每字符2字节。如果将WideString数据保存到文件中,则可以将其加载到UnicodeString中,而不会出现问题。这两种类型之间的区别与内存管理有关,而不是数据格式。
发布于 2010-11-04 14:33:46
正如其他人所提到的,Delphi2009及以上版本中的string (实际上是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 (Delphi2009及以上版本),那么您的字符串类型将是UnicodeString类型的别名,在Delphi2009中引入这个别名来保存Unicode字符串。如果编译器不是unicode (例如Delphi2005),那么您的字符串类型将是旧WideString数据类型的别名。由于它们都是UTF-16,任何版本保存的数据都应该被另一个版本正确读取。
发布于 2010-11-04 12:45:37
的类型完全相同
这不是真的--ExDelphi2010 string有隐藏的内部代码页字段--但可能对您来说并不重要。
那是真的。在德尔菲,2010年SizeOf (Char ) =2(Char= WideChar)。
unicode字符串不可能有不同的代码页--代码页字段用于为Ansi字符串(需要代码页字段)和Unicode字符串(不需要代码页字段)创建通用二进制格式。
如果您将WideString数据保存到Delphi2005中的流中,并在Delphi2010中将相同的数据加载到string中,所有这些都应该工作正常。
WideString = BSTR,这在2005年至2010年期间没有改变
UnicodeString = WideString在Delphi2005中(如果UnicodeString类型存在于Delphi2005-I不知道) UnicodeString = string在Delphi2009及更高版本中。
@Marco和Unicode字符串在德尔菲2009+中有常见的二进制格式(12字节头)。
UnicodeString代码页CP_UTF16 = 1200;
https://stackoverflow.com/questions/4096666
复制相似问题