Как написать txt-файл в blob
Существует таблица Firebird с 2 полями BLOB-объектов - полем blob_binary (подтип =0) и полем blob_Text (подтип =1,utf-8). БД имеет utf-кодировку. Соединение имеет кодировку UTF. Версия Delphi - 10.2.3. Я использую компоненты FireDac для доступа к данным. Сервер Firebird 3.
Приложение должно записывать данные из текстового файла (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.
Но когда я использую тот же код для записи данных в текстовое поле, данные поля выглядят странно, как китайские символы (см. Изображение).
Что я не прав? Как исправить этот код, чтобы написать в обоих полях 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;
Обновление 1: Как я понял, если я сохраняю txt-файл как "юникод" в noteped(или в UCS-2 LE BOM в noteped++), он отлично сохраняется в текстовом блобе, символы скинов исчезают. Аналогично, txt-файл в двоичном двоичном объекте сохраняется нормально, если он находится в кодировке utf-BOM. Хотя очень неудобно не иметь возможности сохранить файл в utf-8.
2 ответа
То, что вы видите, называется mojibake, вызванное интерпретацией текста в кодировке, отличной от той, в которой он был изначально написан. Когда вы получаете случайные символы CJK (китайский / японский / корейский), это обычно происходит из-за неправильной интерпретации 8-битного кода. (ASCII, ANSI, UTF-8 и т. Д.) Закодированный текст как UTF-16. Посмотрите на ваши строковые типы и строковые типы, входящие и исходящие из базы данных, и проверьте предупреждения компилятора о несовпадениях строковых типов ANSI и Unicode, и вы сможете довольно быстро разобраться в этом.
У меня такая же ошибка с ADOQuery и Firebird 2.5 Blob Field Sub_Type 1 (Text) Строковые поля преобразуются нормально, капли - нет.
Если я изменю подключение к IBX, все будет работать нормально
Решено:
SettingsTEXT.AsString := UTF8Decode(SettingsTEXT.AsString)