2012-06-05 85 views
3

我升级D7程序XE,与Delphi 7下我有这样的代码......德尔福XE,火鸟和UTF8

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; 

+0

'someutf8rawbytestring'的定义是什么? (在D7和XE中) – Martijn

+0

使用InterBase我使用了ParamByName('Somefield')。AsWideString和UTF8编码设置 – mjn

+0

在D7中它是一个'字符串',在XE中它是一个Rawbytestring。在这两种情况下,它都是一个utf8编码的8位字符串。 – Terry

回答

2

由于@Lightbulb建议,加入LC_CTYPE = UTF8到TIBDatabase PARAMS解决问题。