Можно ли настроить TStringField, чтобы он работал как TWideStringField в Delphi?
Мы хотим использовать Unicode с Delphi 2009 и Interbase и обнаружили, что для переключения кодировки символов с WIN1252 на UNICODE_FSS или UTF8 мы сначала должны заменить все экземпляры TStringField на TWideStringField во всех модулях данных. Приблизительно для 60 модулей данных мы не можем просто сделать это за один уик-энд. Я вижу только два варианта стратегии миграции:
- найти обходной путь, который позволяет использовать существующие поля TStringField, не вызывая ошибку "ожидается: TWideStringField"
или же
- удалите все постоянные поля, чтобы избежать конфликта типов строк
Насколько я знаю, типы полей для постоянных полей базы данных зарегистрированы в каком-то реестре классов. Можем ли мы использовать это, чтобы заставить Delphi поверить, что TStringField подходит для символьного столбца Interbase с кодировкой UNICODE_FSS или UTF8?
Или мы можем использовать коммерческий драйвер dbExpress, который работает с TStringField в обоих случаях?
См. Также мой связанный вопрос: Delphi dbExpress и Interbase: шаги и риски миграции UTF8?
Обновление: после замены всех вхождений TStringField на TWideStringField во всех файлах DFM и PAS мы обнаружили, что теперь также необходимо умножить значение свойства "Размер" в TWideStringFields на четыре (если мы используем UTF8) в примерно 100 местах. Поэтому я начинаю вознаграждение за способ уменьшить ручную работу по исправлению DFM
2 ответа
Использование TStringField для символов юникода доставит вам неприятности, у него будет $00, в основном строка заканчивается, например, драйверами dbExpress, так как они принимают строки P(Ansi)Char. Использование TWideStringField использует PWideChar в dbExpress, поэтому драйвер ожидает истинные кодовые точки Unicode.
Боюсь, нелегкого выхода нет.
Сергей А. Крюков, "Управление Unicode: что может делать VCL?", The Delphi Magazine, 116 (апрель 2005), с. 33-43 ( Исходный код) Журнал Delphi
Unfortunately, the text of the original article is not freely available, but ask me if you have questions.