3

我正在将 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;

4

1 回答 1

2

正如@Lightbulb 建议的那样,将 lc_ctype=UTF8 添加到 TIBDatabase 参数解决了这个问题。

于 2012-06-06T04:52:48.467 回答