我升級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;
'someutf8rawbytestring'的定義是什麼? (在D7和XE中) – Martijn
使用InterBase我使用了ParamByName('Somefield')。AsWideString和UTF8編碼設置 – mjn
在D7中它是一個'字符串',在XE中它是一個Rawbytestring。在這兩種情況下,它都是一個utf8編碼的8位字符串。 – Terry