Тип поля набора данных 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.