【问题标题】:Delphi XE, Firebird and UTF8Delphi XE、Firebird 和 UTF8
【发布时间】:2012-06-09 04:53:01
【问题描述】:

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

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

在 XE 下,如果 someutf8rawbytestring 包含 unicode 字符,例如 Cyrillic 脚本,那么它们会显示为 ????在数据库中。

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

我正在通过 TIBQuery 和 XE 使用 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;

【问题讨论】:

  • someutf8rawbytestring的定义是什么? (在 D7 和 XE 中)
  • 在 InterBase 中,我使用了 ParamByName ('Somefield').AsWideString 和 UTF8 编码设置
  • 在 D7 中它是一个“字符串”,在 XE 中它是一个 Rawbytestring。在这两种情况下,它都是一个 utf8 编码的 8 位字符串。
  • 您能否提供您正在使用的确切代码(包括任何变量的声明)?
  • @Terry,你试过没有UTF8Encode吗? Delphi 2009+ 具有完整的 unicode 支持,因此无需进行此类转换。此外,检查您的 Firebird 数据库和 TIBDatabase 组件是否将其 CHARACTER SET 设置为 UTF8

标签: delphi utf-8 firebird


【解决方案1】:

按照@Lightbulb 的建议,将 lc_ctype=UTF8 添加到 TIBDatabase 参数解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多