我正在将 D7 程序升级到 XE,在 Delphi 7 下我有这样的代码......
ParamByName ('Somefield').AsString:=someutf8rawbytestring;
在 XE 下,如果 someutf8rawbytestring 包含 unicode 字符,例如 Cyrillic 脚本,那么它们会显示为 ???? 在数据库中。
我看到 someutf8rawbytestring 是 8 个字符长,对于我的 4 个字符的字符串,这是正确的。但是在数据库中只有四个字符。
我正在通过带有 XE 的 TIBQuery 使用 Firebird 2,并更新字符类型为“NONE”的 Varchar 字段。
因此,看起来 utf8 正在被检测到并以某种方式转换回 unicode 数据点,然后导致数据库的字符串转换失败。我尝试将 varchar 字段设置为 UTF8 编码,但结果相同。
那么这应该如何处理呢?
编辑:我可以使用数据库工具并编辑我的数据库字段以获取一些非 ASCII 数据,当我读回它时,它以 utf8 编码字符串的形式出现,我可以使用 UTF8decode 并且它是正确的。但是如果没有一堆????将数据写回这个字段似乎是不可能的。在数据库中。我试过 ParamByName ('Somefield').AsString:=somewidestring; 和 ParamByName ('Somefield').AsWideString:=somewidestring; 我只是在数据库中得到垃圾......
EDIT2:这是代码(在一次迭代中)......
procedure TFormnameEdit.savename(id : integer);
begin
With DataModule.UpdateNameQuery do begin
ParamByName ('Name').AsString:=UTF8Encode(NameEdit.Text);
ParamByName ('ID').AsInteger:=id;
ExecSQL;
Transaction.Commit;
end;
end;