Различные символы в строках TMemo, компилирующих Delphi XE2 Delphi 10.2 - PullRequest
0 голосов
/ 02 июля 2019

Я перенес свое приложение из Delphi XE2 в Delphi 10.2.3.

Я использовал эту инструкцию для чтения поля большого двоичного объекта в компонент TMemo:

Memo1.Text := AnNote.FieldByName('ANBLOB').Value

Я вижу китайские символыв Delphi 10.2 и латинскими символами в Delphi XE2.

Если я использую эту инструкцию:

Memo1.Lines.Text := AnNote.FieldByName('ANBLOB').AsString

Я вижу символ латинского алфавита в Delphi 10.2, почему это так?

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Memo1.Text: = AnNote.FieldByName ('ANBLOB'). Значение

Я вижу китайские символы в Delphi 10.2 и латинские символы в Delphi XE2.

Свойство TField.Value возвращает Variant.

В 10.2 это Variant, вероятно, содержит только необработанные данные большого двоичного объекта.При преобразовании такого Variant в String вся информация о кодировке теряется.Вы получаете «китайские иероглифы» (обычно известные как «Mojibake»), когда необработанные байты ANSI неверно интерпретируются как байты UTF-16.

В XE2 это Variant, вероятно, содержит предварительно декодированный stringвместо необработанных байтов больших двоичных объектов.

Вы хотите, чтобы драйвер базы данных декодировал для вас строки, используя кодировку из метаданных поля базы данных.Таким образом, вы можете столкнуться с ошибкой в ​​драйвере базы данных в 10.2, которая не существовала в XE2.

Memo1.Lines.Text: = AnNote.FieldByName ('ANBLOB'). AsString

Я вижу символ латинского алфавита в Delphi 10.2, почему это так?

TField.AsString позволяет драйверу базы данных декодировать данные поля с использованием метаданных набора символов поля по мере необходимости.

0 голосов
/ 02 июля 2019

Memo1.Text - это TCaption (псевдоним для UnicodeString).

FieldByName('FIELD').Value является Variant.

Это зависит от вашей информации, которая хранится в поле большого двоичного объекта. FieldByName('Field').AsString конвертирует ваш BLOB-объект в String, если это возможно.

Надеюсь, это поможет ответить на ваш вопрос: "почему это так?"!

2 варианта "как это сделать":

  1. вы остаетесь с .AsString, если не было особых причин для перехода на .Value.

  2. обрабатывать различные типы данных, например, изображения, как показано здесь:

    Delphi загрузить изображение сохранить в виде BLOB-объекта в базе данных SQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...