我一直在浏览TDataset类及其字符串字段,在Delphi XE2中注意到AsWideString返回一种类型的UnicodeString。但是它从函数TField.AsString:String中获取值,而后者又调用TFIeld.AsAnsiString:AnsiString。因此任何unicode字符都会丢失?传递给TDataset.GetFieldData的缓冲区也被声明为AnsiChar数组。
我是否正确理解了这一点?
答案 0 :(得分:12)
不,您应该检查用于Unicode字段的TWideStringField类和用于非Unicode字符串的TStringField类。 TField只是一个基类,TField.GetAsWideString是一个虚拟方法,具有后备实现,可被支持Unicode的后代覆盖。
答案 1 :(得分:4)
是的,你确实理解正确。这是 VCL及其文档已被破坏。你的困惑确实很有意义!
在Delphi 2009+实现中,您必须使用AsString
的{{1}}属性和AnsiString
的{{1}}。
实际上,AsWideString
属性定义如下:
string=UnicodeString
我们如何才能发现As*String
会返回property AsString: string read GetAsString write SetAsString;
property AsWideString: UnicodeString read GetAsWideString write SetAsWideString;
property AsAnsiString: AnsiString read GetAsAnsiString write SetAsAnsiString;
?与其他VCL / RTL相比,它完全没有意义。
对AsString
使用AnsiString
类而TStringField
使用AnsiString
的实现已被破坏。
此外,documentation is also broken:
Data.DB.TField.AsString
将字段的值表示为字符串(Delphi)或AnsiString(C ++)。
这不代表Delphi中的TWideStringField
,而是string=UnicodeString
!该属性使用普通string
类型这一事实完全具有误导性。
从数据库的角度来看,由DB驱动程序来处理Unicode或使用特定的字符集。但是从VCL的角度来看,在Delphi 2009+中你应该只知道AnsiString
类型,并且相信使用string=UnicodeString
将准备好Unicode。