有一个带有2个blob字段的Firebird表-blob_binary字段(子类型= 0)和blob_Text字段(子类型= 1,utf-8)。 DB具有utf编码。连接具有utf编码。 Delphi的版本是10.2.3。我使用FireDac组件进行数据访问。服务器是Firebird3。
应用程序必须将文本文件(utf-8)中的数据写入“内容”表的两个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,则为奇怪字符。
但是当我使用相同的代码在文本斑点中写入数据时,字段数据看起来像汉字一样奇怪(见图片)。
我怎么了?如何更正此代码以在两个字段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文件保存为noteped(或note ++中的ucs-2 LE BOM)中的“ unicode”,它会很好地保存在文本blob中,中文字符会消失。同样,如果二进制文件中的txt文件采用utf-BOM编码,则可以很好地保存。虽然非常不舒服,但是无法将文件保存在 utf-8 中。
答案 0 :(得分:1)
您所看到的称为mojibake,是由于用与最初编写时不同的编码来解释文本。当您获得随机的CJK(中文/日文/韩文)字符时,通常来自错误地将8位(ASCII,ANSI,UTF-8等)解释为UTF-16的编码文本。查看一下您的字符串类型以及进入数据库和从数据库中出来的字符串类型,并检查有关ANSI和Unicode字符串类型不匹配的编译器警告,您应该可以很快地找到答案。>