Как написать txt-файл в blob - PullRequest
       59

Как написать txt-файл в blob

0 голосов
/ 13 февраля 2019

Существует таблица Firebird с 2 полями BLOB-объектов - полем blob_binary (подтип = 0) и полем blob_Text (подтип = 1, utf-8).БД имеет utf-кодировку.Соединение имеет кодировку UTF.Версия Delphi - 10.2.3.Я использую компоненты FireDac для доступа к данным.Сервер Firebird 3.

enter image description here

Приложение должно записывать данные из текстового файла (utf-8) в оба поля двоичных объектов таблицы «Содержимое».Текстовый файл, который я должен написать в BLOB-объектах, содержит текст на английском, русском и грузинском языках (см. Изображение).

Файлы проекта и БД, с правами на редактирование

Приведенный ниже код записывает текст в поле двоичного двоичного объекта , но символы странные (не символы ???. Может быть символы Ansi?).

Код для сохранения текстового файла в Blob_Binary поле:

ID:=Query1.FieldByName('Content_id').asInteger;
OpenDialog1.Execute;
Query1.Close;
Query1.SQL.Text := 'SELECT * FROM content where Content_id=:id';
Query1.Params[0].AsInteger:=ID;
Query1.open;

Query1.Edit;
(Query1.FieldByName('BLOB_BINARY') as TBlobField).LoadFromFile(OpenDialog1.FileName);
Query1.Post;

Когда я сохраняю текстовый файл в двоичном блобе поле, тогда:

1) если я сохранил текстовый файл в кодировке utf-BOM, я получаю вобычный текст двоичного двоичного объекта и

2) странные символы, если я выберу кодировку текстового файла utf

Но когда я использую тот же код для записи данных в текстовое пятно данные поля выглядят странно, как китайские символы (см. Изображение).

enter image description here

Что я не так делаю?Как исправить этот код, чтобы написать в обоих полях UTF символов?

Я пробовал другие решения, но результат тот же.Например:

ID:=Query1.FieldByName('Content_id').asInteger;
OpenDialog1.Execute;
Query1.Close;
Query1.SQL.Text := 'Update content set Blob_Text=:Blob_Text where 
Content_id=:id';
Query1.Params[0].DataType := ftBlob;
Query1.Params[0].AsStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
Query1.Params[1].AsInteger:=ID;
Query1.ExecSQL;

Update1: Как я понял, если я сохраняю txt-файл как "unicode" в noteped (или LE UMS-2 BOM в noteped ++), он сохраняется нормальнов текстовом блобе исчезли символы скулов.Аналогично, txt-файл в двоичном двоичном объекте сохраняется нормально, если он находится в кодировке utf-BOM.Хотя очень неудобно сохранять файл в utf-8 .

enter image description here

1 Ответ

0 голосов
/ 13 февраля 2019

То, что вы видите, известно как mojibake , вызванное интерпретацией текста в кодировке, отличной от той, в которой он был изначально написан. Когда вы получаете случайные символы CJK (китайский / японский / корейский),обычно это происходит из-за неправильной интерпретации 8-битного (ASCII, ANSI, UTF-8 и т. д.) закодированного текста как UTF-16.Посмотрите на ваши строковые типы и строковые типы, входящие и исходящие из базы данных, и проверьте предупреждения компилятора о несовпадениях строковых типов ANSI и Unicode, и вы сможете довольно быстро разобраться в этом.

...