Тип поля набора данных Delphi XE2 TStringField не поддерживает Unicode?

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

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

2 ответа

Решение

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

Да, вы все правильно поняли. Это 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 в Дельфи, но AnsiString! Тот факт, что в собственности используется равнина string=UnicodeString Тип совершенно ошибочный.

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

Другие вопросы по тегам