Можно ли настроить Tstringfield, чтобы работать как Twidestringfield в Delphi?
Вопрос
Мы хотим использовать Unicode с Delphi 2009 и Interbase и обнаружили, что для переключения кодирования символов с Win1252 на Unicode_fss или UTF8 мы сначала должны заменить все экземпляры Tstringfield на Twidestringfield во всех данных DataModules. Примерно для 60 данных мы не можем просто сделать это за один выходной. Я вижу только два варианта для стратегии миграции:
- Найдите обходной путь, который позволяет использовать существующие поля Tstringfield, не запуская ошибку «ожидаемое: Twidestringfield»
или же
- Удалить все постоянные поля, чтобы избежать конфликта типа строки
Насколько я знаю, типы поля для постоянных полей базы данных зарегистрированы в каком -то реестре классов. Можем ли мы использовать это, чтобы Delphi поверил, что Tstringfield в порядке для межбазного символа с кодированием Unicode_fss или UTF8?
Или мы можем использовать коммерческий драйвер dbexpress, который работает с Tstringfield в обоих случаях?
Смотрите также мой связанный вопрос: Delphi dbexpress и Interbase: UTF8 Шаги миграции и риски?
Обновление: после замены всех событий TStringfield на Twidestringfield во всех файлах DFM и PAS мы обнаружили, что теперь также необходимо увеличить значение свойства «размер» TwidestringFields на четыре (если мы используем UTF8) в примерно 100 местах. Поэтому я начинаю щедрость, чтобы уменьшить ручную работу, чтобы исправить DFMS
Решение
Использование Tstringfield для символов Unicode доставит вам неприятности, в нем будут 00 долларов, в основном заканчивая строку, например, драйверы dbexpress, так как они принимают strings p (ansi). Использование Twidestringfield использует PwideChar в DBEXPRESS, поэтому драйвер ожидает истинного кодепунтов Unicode.
Боюсь, нет легкого выхода.
Другие советы
Sergey A Kryukov, «Управление 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.