zig*_*zig 5 delphi unicode delphi-7
我有很老的代码(来自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;
Run Code Online (Sandbox Code Playgroud)
问:是不是安全的,以取代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将添加代码来初始化你的字符串.
您不必自己初始化它们.
就像shorttrings WideStrings不是引用计数一样,但是当你dispose
记录它们时它们会被销毁.
如果你将Widestring分配给另一个Widestring Delphi会复制,这比refcounting效率稍差,但不是一个问题.
每当Widestring超出范围时,它就会被销毁.
注意PWideChar,当WideString被破坏时,这些将是悬空.
VCL无法显示WideString
请注意,尽管Delphi 7 确实支持使用Widestring的Unicode,但VCL无法显示您的Widestrings,它只能显示AnsiString.
如果要显示WideStrings使用TNT组件,请参阅此答案以获取更多信息:在Delphi版本中处理Unicode字符串<= 2007
如果你要将WideString分配给(Ansi)字符串,你也可以使用普通字符串,因为你将失去所有的unicode.
您可以使用UTF8,但D7也不能显示UTF8.
警告:亚洲语言环境中
的索引另一个需要注意的是,MyWidestring[i]
这并不一定意味着第i个字符,因为Unicode不能完全表示为每个字符2个字节.
除非您使用的是亚洲语言,否则这不会影响您.
问:用WideString替换String [70]是否安全;
是的,但它更轻松地更换String[70]
与String
(又名AnsiString类型).因为D7 VCL支持AnsiString但不支持WideString.
除此之外你没有真正的问题.
进一步阅读
https://grahamwideman.wikispaces.com/Delphi+String+Types