Тип поля набора данных Delphi XE2 TStringField не поддерживает Unicode? - PullRequest
13 голосов
/ 27 февраля 2012

Я просматривал класс TDataset и его строковые поля в Delphi XE2 и заметил, что AsWideString возвращает тип UnicodeString.Однако он получает значение из функции TField.AsString: String, которая в свою очередь вызывает TFIeld.AsAnsiString: AnsiString.Поэтому любые символы Unicode будут потеряны?Также буфер, который передается в TDataset.GetFieldData, объявляется как массив AnsiChar.

Правильно ли я понимаю?

Ответы [ 2 ]

12 голосов
/ 27 февраля 2012

Нет, вы должны проверить класс TWideStringField , который предназначен для полей Unicode, и класс TStringField , который предназначен для строк, не относящихся к Юникоду. TField - это просто базовый класс, а TField.GetAsWideString - это виртуальный метод с резервной реализацией, который переопределяется потомками, поддерживающими Unicode.

4 голосов
/ 22 апреля 2013

ДА, вы все правильно поняли. Это VCL и его документация, которые не работают . Ваша путаница действительно имеет смысл!

В реализации Delphi 2009+ необходимо использовать свойство AsString для AnsiString и 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;

Как же мы можем узнать, что AsString возвращает AnsiString? Это просто не имеет никакого смысла, по сравнению с остальной частью VCL / RTL.

Реализация, использующая класс TStringField для AnsiString и TWideStringField для string=UnicodeString, не работает.

Кроме того, документация также не работает :

Data.DB.TField.AsString

Представляет значение поля в виде строки (Delphi) или AnsiString (C ++).

Это не означает string в Delphi, но AnsiString! Тот факт, что свойство использует простой тип string=UnicodeString, совершенно ошибочно.

С точки зрения базы данных, драйвер БД должен обрабатывать Unicode или работать с определенной кодировкой. Но с точки зрения VCL, в Delphi 2009+ вы должны знать только о типе string и быть уверенным, что использование AsString: String будет готово к Unicode.

...