TMemo行中的不同字符可编译Delphi XE2 Delphi 10.2

时间:2019-07-02 12:00:05

标签: delphi

我已经将我的应用程序从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中看到了拉丁字母中的字符, 为什么会这样?

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.TextTCaptionUnicodeString的别名)。

FieldByName('FIELD').ValueVariant

这取决于您在blob字段中存储的信息。 FieldByName('Field').AsString会将您的Blob转换为String

希望能回答您的问题:“这是为什么?”!

“操作方法”的2个选项:

  1. 如果没有特殊原因切换到.AsString,您将留在.Value

  2. 处理不同的数据类型,例如图片,如下所示:

    Delphi load image save as blob in a sql database