如何在blob中写入txt文件

Posted

技术标签:

【中文标题】如何在blob中写入txt文件【英文标题】:How to write txt-file in blob 【发布时间】:2019-02-12 22:58:34 【问题描述】:

Firebird 表有 2 个 blob 字段 - blob_binary 字段(子类型=0)和 blob_Text 字段(子类型=1,utf-8)。 DB 有 utf 编码。连接具有 utf 编码。 Delphi 的版本是 10.2.3。我使用 FireDac 组件进行数据访问。服务器是 Firebird 3。

应用程序必须将数据从文本文件(utf-8)写入“内容”表的两个 blob 字段。 文本文件,我必须写成 blob,包含英语、俄语和格鲁吉亚语的文本(见图)。

Project and DB files, with editing permission

下面的代码在 binary blob 字段中写入文本,但字符很奇怪(不是 ??? simbols。也许是 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;

当我在 binary blob 字段中保存文本文件时:

1) 如果我在编码 utf-BOM 中保存文本文件,我会得到二进制 blob 普通文本和

2) 如果我为文本文件编码 utf 选择奇怪的字符。

但是当我使用相同的代码在 text blob 中写入数据时,字段数据看起来像汉字一样奇怪(见图)。

我做错了什么?如何更正此代码以在两个字段中写入 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 中的“unicode”(或 noteped++ 中的 ucs-2 LE BOM),它会在文本 blob 中保存得很好,中文字符消失了。同样,二进制 blob 中的 txt 文件如果采用 utf-BOM 编码,则可以很好地保存。虽然不能用 utf-8 保存文件很不舒服。

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 更多截图和本主题讨论这个问题:sql.ru/forum/1308971-a/… 【参考方案1】:

您看到的内容被称为mojibake,它是由以不同于最初写入的编码解释文本引起的。当您收到随机的 CJK(中文/日文/韩文)字符时,它通常来自将 8 位(ASCII、ANSI、UTF-8 等)编码文本错误地解释为 UTF-16。查看您的字符串类型以及进出数据库的字符串类型,并检查有关 ANSI 和 Unicode 字符串类型不匹配的编译器警告,您应该能够很快地了解这一点。

【讨论】:

梅森·惠勒。谢谢你的回答,但我尝试了我所知道的一切:数据库创建为 utf,表字段为 utf,firedac 连接定义为 utf。文本文件被创建为 utf。我已经3天没睡了。可能是什么原因? @basti 如果你已经三天没睡觉了,也许你需要走开,睡一觉,用新的眼光回顾问题。 8-bit (ASCII, ANSI, UTF-8, etc) encoded text as UTF-16 - 应该是 2009 年和更新版本的 Delphi(又名“Unicode Delphi”)的典型特征,也适用于 Java 和 C#,当一个人没有指定字符集连接或指定 OCTET 二进制文件时一。我曾经甚至说服 Mark 禁止隐式 NONE-charset 连接,可惜时间不长。【参考方案2】:

我对 ADOQuery 和 Firebird 2.5 Blob Field Sub_Type 1 (Text) 有同样的错误 字符串字段转换得很好,blob 不是。

如果我更改与 IBX 的连接,一切正常

解决者:

SettingsTEXT.AsString := UTF8Decode(SettingsTEXT.AsString)

【讨论】:

以上是关于如何在blob中写入txt文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在不写入文件的情况下压缩流并将其上传到 Azure Blob 存储?

如何在 Python 3 中写入 .txt 文件

如何将 Blob 写入本地文件? [复制]

在 Azure Blob 存储中覆盖后如何命名 csv 文件

如何在 Xcode 项目中将字典数组写入 .txt 文件

如何使用 VBA 创建和写入 txt 文件