2012-06-05 117 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解決問題。