【发布时间】: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。