Delphi XE2 Dataset字段类型TStringField不支持Unicode吗?

时间:2012-02-27 01:58:16

标签: delphi unicode delphi-xe delphi-xe2 tdataset

我一直在浏览TDataset类及其字符串字段,在Delphi XE2中注意到AsWideString返回一种类型的UnicodeString。但是它从函数TField.AsString:String中获取值,而后者又调用TFIeld.AsAnsiString:AnsiString。因此任何unicode字符都会丢失?传递给TDataset.GetFieldData的缓冲区也被声明为AnsiChar数组。

我是否正确理解了这一点?

2 个答案:

答案 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。