我有很旧的代码(来自D3):

TMyRecord  = record
  Index   : Integer;
  Header  : String[70];
  Strings : Array[1..MAX_VALUES] of String[70];
end;

TMyClass = class(TComponent)
  FData  : ^TMyRecord;
  ...
end;

constructor TMyClass.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  New(FData);
  ...
end;

destructor TMyClass.Destroy;
begin
   Dispose(FData);
   inherited;
end;

问:用String[70]替换WideString;和用Array[1..MAX_VALUES] of String[70]替换Array[1..MAX_VALUES] of WideString是安全的吗? (请说明原因)

我需要它来在Delphi 7中支持Unicode。

最佳答案

通常,您永远不要使用Widestring。
它仅用于与COM BSTR兼容。

但是,您使用的是2009年之前的版本,因此如果需要 Unicode,则别无选择。
WideString是动态分配的,当您使用new记录时,Delphi将添加代码以初始化您的字符串。
您不必自己初始化它们。

就像shortstrings一样,WideStrings不会被引用计数,但是当您对记录进行dispose编码时,它们将被销毁。
如果将Widestring分配给另一个Widestring,则Delphi会进行复制,这比refcounting的效率略低,但不是问题。

每当Widestring超出范围时,它将被销毁。

使用PWideChar时要小心,当WideString销毁时,它们会悬空。

VCL无法显示WideString
请注意,尽管Delphi 7 确实支持支持具有Widestring的Unicode,但VCL无法显示您的Widestring,而只能显示AnsiString。
如果要显示使用TNT组件的WideString,请参见以下答案以获取更多信息:Handling a Unicode String in Delphi Versions <= 2007

如果要为(Ansi)string分配WideString,则最好使用纯字符串,因为您会丢失所有的unicode。
您可以使用UTF8,但D7也不能显示UTF8。

警告:在亚洲语言环境中建立索引
进一步的警告是MyWidestring[i]不一定表示第ith个字符,因为Unicode无法以每个字符2个字节的形式完全表示Unicode。
除非您使用亚洲语言,否则这不会影响您。



是的,但是用String[70](又名AnsiString)替换String更加容易。因为D7 VCL支持AnsiString但不支持WideString。
除此之外,您实际上没有任何问题。

进一步阅读
https://grahamwideman.wikispaces.com/Delphi+String+Types

09-17 20:30