Delphi XE,Firebird和UTF8

时间:2012-06-05 06:40:59

标签: delphi utf-8 firebird

我正在将D7程序升级到XE,在Delphi 7下我有这样的代码......

ParamByName('Somefield')。AsString:= someutf8rawbytestring;

在XE下如果someutf8rawbytestring包含像西里尔字母这样的unicode字符,那么它们会显示为????在DB。

我看到someutf8rawbytestring是8个字符长,对于我的4个字符串,这是正确的。但在DB中只有四个字符。

我正在使用Firebird 2通过TIBQuery和XE并更新字符类型为“NONE”的Varchar字段。

所以它看起来像是在检测utf8并以某种方式转换回unicode数据点,然后这就是DB的字符串转换失败。我已经尝试将varchar字段设置为UTF8编码,但结果相同。

那应该如何处理?

编辑:我可以使用数据库工具并编辑我的数据库字段以获得一些非ASCII数据,当我读回它时,它作为utf8编码的字符串,我可以使用UTF8decode并且它是正确的。但是如果没有得到一堆????,将数据写回这个领域似乎是不可能的。在DB中。我试过ParamByName('Somefield')。AsString:= somewidestring;和ParamByName('Somefield')。AsWideString:= somewidestring;而我只是在DB中得到垃圾......

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;

1 个答案:

答案 0 :(得分:2)

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