3

D7 プログラムを XE にアップグレードしていますが、Delphi 7 では次のようなコードがありました...

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

XE では、someutf8rawbytestring にキリル文字などの Unicode 文字が含まれている場合、それらは ???? として表示されます。DBで。

someutf8rawbytestring の長さは 8 文字で、私の 4 文字の文字列は正しいです。しかし、DB には 4 文字しかありません。

XEでTIBQueryを介してFirebird 2を使用し、Varcharフィールドを文字タイプ「NONE」で更新しています。

つまり、utf8 が検出され、何らかの方法で Unicode データ ポイントに変換され、DB の文字列変換に失敗しているように見えます。varchar フィールドを UTF8 エンコーディングに設定しようとしましたが、結果は同じです。

では、これをどのように扱うべきでしょうか。

編集: データベース ツールを使用して DB フィールドを編集し、非 ASCII データを含めることができます。それを読み返すと、UTF8decode を使用できる utf8 でエンコードされた文字列として表示され、正しいです。しかし、このフィールドにデータを書き戻すことは、大量の ???? を取得せずには不可能に思えます。DBで。ParamByName ('Somefield').AsString:=somewidestring; を試しました。および ParamByName ('Somefield').AsWideString:=somewidestring; そして、私はDBにゴミを入れます...

EDIT2:これがコードです(1回の繰り返しで)...



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;

4

1 に答える 1