我已经将我的应用程序从Delphi XE2迁移到了Delphi 10.2.3。
我已使用此指令将blob字段读入TMemo组件:
Memo1.Text := AnNote.FieldByName('ANBLOB').Value
我在Delphi 10.2中看到了中文字符,在Delphi XE2中看到了拉丁字符。
如果我使用此指令:
Memo1.Lines.Text := AnNote.FieldByName('ANBLOB').AsString
我在Delphi 10.2中看到了拉丁字母中的字符, 为什么会这样?
答案 0 :(得分:0)
Memo1.Text:= AnNote.FieldByName('ANBLOB')。Value
我在Delphi 10.2中看到了中文字符,在Delphi XE2中看到了拉丁字符。
TField.Value
属性返回一个Variant
。
在10.2中,Variant
可能仅包含Blob的原始数据。将此类Variant
转换为String
时,所有字符集信息都会丢失。当原始ANSI字节被误解为UTF-16字节时,您将获得“汉字”(通常称为“ Mojibake”)。
在XE2中,该Variant
可能包含一个预解码的string
而不是原始的blob字节。
您想要使用来自数据库字段元数据的字符集,为数据库驱动程序为您解码字符串。因此,您可能会遇到XE2中不存在的10.2版数据库驱动程序中的错误。
Memo1.Lines.Text:= AnNote.FieldByName('ANBLOB')。AsString
我在Delphi 10.2中看到了拉丁字母的字符,为什么会这样?
TField.AsString
允许数据库驱动程序根据需要使用字段的字符集元数据对字段数据进行解码。
答案 1 :(得分:-2)
Memo1.Text
是TCaption
(UnicodeString
的别名)。
FieldByName('FIELD').Value
是Variant
。
这取决于您在blob字段中存储的信息。 FieldByName('Field').AsString
会将您的Blob转换为String
。
希望能回答您的问题:“这是为什么?”!
“操作方法”的2个选项:
如果没有特殊原因切换到.AsString
,您将留在.Value
。
处理不同的数据类型,例如图片,如下所示: