Lazrus UTF-8 baza danych WIN1250

0

W wątku Konwersja bazy na UTF-8 pisałem o konwersji bazy na potrzeby Lazarusa z WIN1250 do UTF-8.
Może zrobić by to od strony aplikacji tzn. zostawić bazę na kodowaniu WIN1250 a samą obsługę bazy napisać pod WIN1250.
Proszę o opinie oraz jak to fizycznie zrobić w środowisku Lazarus ?

0

jeżeli korzystasz z komponentów ZEOS, to we właściwościach połączenia ustawiasz:

ZConnection1.AutoEncodeStrings:=True;
  ZConnection1.ControlsCodePage:=cCP_UTF8;
  ZConnection1.ClientCodepage:='WIN1250';
0
Paweł Dmitruk napisał(a):

jeżeli korzystasz z komponentów ZEOS, to we właściwościach połączenia ustawiasz:

ZConnection1.AutoEncodeStrings:=True;
  ZConnection1.ControlsCodePage:=cCP_UTF8;
  ZConnection1.ClientCodepage:='WIN1250';

Niestety korzystam ze standardowej karty Lazarusa SQLDB TIBConnection :(

0

do łączenia używam TIBConnection

1

dodajesz, np. takie procedury:

uses db, LConvEncoding;

procedure TForm1.exec(DataSet: TSQLQuery);
var
  i: integer;
begin
  for i:=0 to DataSet.Params.Count-1 do
  begin
    if DataSet.Params[i].DataType=ftString then
    DataSet.Params[i].AsString:=UTF8ToCP1250(DataSet.Params[i].AsString);
  end;
  DataSet.ExecSQL;
end;

procedure TForm1.open(DataSet: TSQLQuery);
var
  i: integer;
begin
  for i:=0 to DataSet.Params.Count-1 do
  begin
    if DataSet.Params[i].DataType=ftString then
    DataSet.Params[i].AsString:=UTF8ToCP1250(dataset.Params[i].AsString);
  end;
  DataSet.Open;
  for i:=0 to DataSet.Fields.Count-1 do
  begin
    if DataSet.Fields[i].DataType=ftString then
    begin
      DataSet.Fields[i].OnGetText:=@GetText;
      DataSet.Fields[i].OnSetText:=@SetText;
    end;
  end;
end;

procedure TForm1.GetText(Sender: TField; var aText: string; DisplayText: Boolean);
begin
  aText:=CP1250ToUTF8(Sender.AsString);
end;

procedure TForm1.SetText(Sender: TField; const aText: string);
begin
  Sender.AsString:=UTF8ToCP1250(aText);
end;    

a później w kodzie zamiast SQLQuery1.Open; lub SQLQuery1.Active:=True; używasz:

open(SQLQuery1);

zamiast SQLQuery.ExecSQL; używasz:

exec(SQLQuery1);
2

Pamiętajcie, tylko, że jeżeli w aplikacji UTF8 wprowadzę znaki z poza tablicy WIN1250 - to zapewne nastąpi utrata danych.

0

http://www.destructor.de/firebird/charsets.htm i poczytaj od Specifying the client character set a nie wymyślacie jakieś potworki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1