13

Delphi XE2でTDatasetクラスとその文字列フィールドを調べていたところ、AsWideStringがUnicodeStringのタイプを返すことに気付きました。ただし、関数TField.AsString:Stringから値を取得し、TFIeld.AsAnsiString:AnsiStringを呼び出します。したがって、Unicode文字は失われますか?また、TDataset.GetFieldDataに渡されるバッファーは、AnsiCharの配列として宣言されます。

私はこれを正しく理解していますか?

4

2 に答える 2

12

いいえ、 Unicodeフィールド用のTWideStringFieldクラスと非Unicode文字列用のTStringFieldクラスを調べる必要があります。TFieldは単なる基本クラスであり、TField.GetAsWideStringは、Unicode対応の子孫によってオーバーライドされるフォールバック実装を備えた仮想メソッドです。

于 2012-02-27T02:14:04.583 に答える
4

はい、あなたはそれを正しく理解しました。これは壊れているVCLとそのドキュメントです。あなたの混乱は完全に理にかなっています!

Delphi 2009+の実装では、のAsStringプロパティを使用する必要がAnsiStringあります。AsWideStringstring=UnicodeString

実際、As*Stringプロパティは次のように定義されています。

property AsString: string read GetAsString write SetAsString;
property AsWideString: UnicodeString read GetAsWideString write SetAsWideString;
property AsAnsiString: AnsiString read GetAsAnsiString write SetAsAnsiString;

いったいどうやってそれAsStringが戻ってくるのかを知ることができるAnsiStringでしょうか?他のVCL/RTLと比較すると、まったく意味がありません。

forとforのTStringFieldクラスを使用する実装は壊れています。AnsiStringTWideStringFieldstring=UnicodeString

さらに、ドキュメントも壊れています:

Data.DB.TField.AsString

フィールドの値を文字列(Delphi)またはAnsiString(C ++)として表します。

これはstringDelphiではではなく、AnsiString!プロパティがプレーンstring=UnicodeStringタイプを使用しているという事実は、完全に誤解を招きます。

データベースの観点では、Unicodeを処理するか、特定の文字セットを操作するかはDBドライバー次第です。ただし、VCLの観点から見ると、Delphi 2009以降では、タイプについてのみ知っておく必要があり、使用することでUnicodeに対応できることstringを確信できます。AsString: String

于 2013-04-22T05:32:13.050 に答える