Несоответствие строки Delphi Unicode

У меня есть приложение Delphi 7, использующее базу данных Paradox через BDE, которую я преобразовал в Delphi XE3 и Firebird. В базе данных Paradox есть строковое поле, содержащее зашифрованную строку, которая предположительно используется для лицензирования программного обеспечения. Проблема в том, что подпрограмма, которая читала эту строку в старой программе (D7/Paradox), работала нормально, в новой программе (XE3/Firebird) подпрограмма выдает ошибку. Причина, которую я обнаружил при отладке, заключается в том, что строка после чтения из базы данных отличается. Как я могу это исправить?

Строка в старой базе Paradox:

Ng-DrLrDOtfâtD89D1'D'îu

Строка в новой базе данных Firebird:

Ng-DrLrDOtfâtD89D1'D'îu

Как вы можете видеть выше, строка одинакова в обеих базах данных.

В новой программе Delphi XE3, используя компоненты доступа к данным UniDAC, когда я пытаюсь получить значение поля с помощью FieldByName('fieldname').AsString , возвращается вот что:

Ng-DrLrDOtfâtD89D1'D'îu

Вы можете видеть, что пара символов отличается. Это вызывает ошибку в подпрограмме, которая проверяет эту строку в программе. Испытывали ли вы это раньше? Каковы возможные причины этой проблемы и какие шаги я могу предпринять для ее решения.

Примечание 1. Я преобразовал базу данных Paradox в Firebird с помощью конвертера, написанного в Delphi (фактический код для этого конвертера см.: http://goo.gl/6xu2ST)

Примечание 2. У меня есть база данных, созданная с НАБОРОМ СИМВОЛОВ ПО УМОЛЧАНИЮ UTF8, а компонент соединения UniDAC (TUniConnection) имеет набор символов SpecificOptions, установленный на «UTF8».


person Steve F    schedule 30.07.2013    source источник
comment
какую версию Firebird вы используете?   -  person Sam    schedule 31.07.2013


Ответы (1)


Я решил проблему:

  1. В модуле данных или коде установите для свойства SpecificOptions UseUnicode компонента TUniConnection значение True.

  2. Закройте проект и Delphi IDE. Откройте WinGrep и выполните поиск-замену во всех файлах проекта PAS и DFM для строки: TStringField, изменив ее на TWideStringField.

  3. Перекомпилировать.

И вуаля, работает идеально! Ошибки, возникающие во время выполнения из-за неполного перевода/интерпретации символов Unicode из базы данных, исчезли.

Спасибо всем, кто ответил ранее.

person Steve F    schedule 31.07.2013