кодировки в dbf, fb

Модератор: Модераторы

кодировки в dbf, fb

Сообщение QuAzI » 10.06.2009 00:16:55

Скачал последний релиз, потыкался в TDbf и IBconnection, обломился. Скачал сегодняшний снапшот, там наконец-то вместо пустых полей стало показывать кракозяблы, но легче не стало.
Целевые кодировки WIN1251 для FB1.5 и cp866/cp1251 для dbf. В Delphi благо TDbf сам умел определять кодировку БД и приводил её так, что при выводе данных в Grid лишних телодвижений уже не надо. FIBplus хоть и спрашивает кодировку, но её раз прописал и живи, радуйся. Перечитав форум, я так понял что на старых релизах всё было ещё более менее, а в последних релизах всё сломали и перевели в UTF-8.
Сидеть и конвертать всё в UTF-8 нельзя - для FB около 20 программных продуктов, которые уже заточены под win1251 и ради костыля от них никто отказываться не будет. С Dbf баз меньше, но опять же ПО переписывать никто не будет, тем более некоторое ПО крутится с FoxPro 2.6 и работает с фискальными регистраторами (старые платёжные системы).
Кто-нибудь знает способ заставить работать компоненты с исходными кодировками? Хорошей практикой считается, когда компонентина приводит данные к системной кодировке без лишних телодвижений, но это только мечты.

p.s. есть ещё пара баз с Paradox, вроде скачал компонентину для работы из Lazarus с ними, но ещё не пробовал. Если проблему кодировок не решу (а там она скорее всего тоже есть), чувствую прийдётся выкинуть lazarus :(
QuAzI
незнакомец
 
Сообщения: 6
Зарегистрирован: 09.06.2009 21:14:55

Re: кодировки в dbf, fb

Сообщение Inferno » 10.06.2009 06:23:04

что за паника?
в DBF действительно не получилось прикрутить cp866... пришлось писать функцию перекодировки - не проблема... могу поделиться
IBconnection - работает без проблем cp1251 (IBconnection тож кодировку просит которая в БД используются)
у мня lazarus 0.9.27
Аватара пользователя
Inferno
новенький
 
Сообщения: 78
Зарегистрирован: 20.03.2009 14:40:20
Откуда: Тюмень

Re: кодировки в dbf, fb

Сообщение QuAzI » 10.06.2009 08:44:20

Буду признателен за функцию.
А IBconnection как обучили "русскому" ? Кстати, у вас какая ОС? Я так подозреваю в линухе с локалью UTF-8 всё нормально и так, а вот в винде у меня кракозяблы вместо русских.

Добавлено спустя 1 час 9 минут 29 секунд:
В аттаче база FB с win1251 в том виде, как я получаю её в виндовом лазарусе.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
QuAzI
незнакомец
 
Сообщения: 6
Зарегистрирован: 09.06.2009 21:14:55

Re: кодировки в dbf, fb

Сообщение Vadim » 10.06.2009 11:02:22

FB 2.0 и выше автоматически переводит кодировку из кодировки базы в указанную, точно так же как MySQL и программисту не надо об этом заботиться. Про версию 1.5 не знаю, не пробовал.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: кодировки в dbf, fb

Сообщение QuAzI » 10.06.2009 19:26:36

Из того что я понял, кругом облом и кодировки не пляшут.
QuAzI
незнакомец
 
Сообщения: 6
Зарегистрирован: 09.06.2009 21:14:55

Re: кодировки в dbf, fb

Сообщение alexs » 10.06.2009 20:05:42

QuAzI писал(а):Из того что я понял, кругом облом и кодировки не пляшут.

Ответ не верен
При работе с нормальными БД - как раз всё работает по умолчанию.
DBF сюда не относится. Но и её можно заставить работать - хотя не нужно.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: кодировки в dbf, fb

Сообщение QuAzI » 10.06.2009 22:47:27

Странно, на дельфе свободно работал с TDbf, стандартные компоненты, тянущие BDE, мне нафиг не впились, и был доволен как слонопотам. Хотя, может это две разных компонентины??
Касательно "нормальных БД", в FireBird 1.5 не заплясало.
И опять таки, уже третий пост про "можно" и ни одного конкретного куска кода.
QuAzI
незнакомец
 
Сообщения: 6
Зарегистрирован: 09.06.2009 21:14:55

Re: кодировки в dbf, fb

Сообщение alexs » 11.06.2009 01:26:53

QuAzI писал(а):И опять таки, уже третий пост про "можно" и ни одного конкретного куска кода.


Inferno писал же, что в TDbf надо просто дописать функцию перекодировки тикста при чтении из файла в UTF8 (соответсвенно обратно при записи).
Это так сложно сделать самому?

Насчёт птицы - обнови версию. В плане совместимости 1.5 и 2.0.4 очень хороши - в нормально написанном софте вобще проблем нет (личный опыт).
А в 2-ке просто указывай при подключении кодировку UTF8 и FireBird автоматически произведёт перекодировку из того, что в находится в базе в нужный тебе текст. Единственно - текстовые блобы. Они перекодируются автоматом начиная с версии 2.1.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: кодировки в dbf, fb

Сообщение Inferno » 11.06.2009 08:46:48

QuAzI держи для DBF: cp866->cp1251 используешь dos2win ,а потом то что перекодировал SysToUTF8 для показа в форме
можно наверное воткуть событие OnGetText на всё объект-поля
вот модуль перекодировки:
Код: Выделить всё
unit ucodestr;

{$mode objfpc}{$H+}


interface

uses sysutils;

const
  // Чтобы не было проблем с распознаванием кодировок на разных платформах
  rus_chars: pChar = #197#210#211#206#208#192#205#202#213#209
  + #194#204#229#243#232#238#240#224#234#245#241#236
    ;
  lat_chars: pChar = 'ETYOPAHKXCBMeyuopakxcm';
  small_chars: pChar =
  #113#119#101#114#116#121#117#105#111#112#97#115#100#102#103
    + #104#106#107#108#122#120#99#118#98#110#109#233#246#243#234
    + #229#237#227#248#249#231#245#250#244#251#226#224#239#240#238
    + #235#228#230#253#255#247#241#236#232#242#252#225#254#184
    ;
  cap_chars: pChar =
  #81#87#69#82#84#89#85#73#79#80#65#83#68#70#71#72#74#75#76#90
    + #88#67#86#66#78#77#201#214#211#202#197#205#195#216#217#199
    + #213#218#212#219#194#192#207#208#206#203#196#198#221#223#215
    + #209#204#200#210#220#193#222#168
    ;
  cp1251: pChar =
  #233#246#243#234#229#237#227#248#249#231#245#250#244#251#226
    + #224#239#240#238#235#228#230#253#255#247#241#236#232#242#252
    + #225#254#184#201#214#211#202#197#205#195#216#217#199#213#218
    + #212#219#194#192#207#208#206#203#196#198#221#223#215#209#204
    + #200#210#220#193#222#168#185
    ;
  (* Inf: изменил таблицу перекодировки cp866 185 на 252 *)
  cp866: pChar =
  #169#230#227#170#165#173#163#232#233#167#229#234#228#235#162
    + #160#175#224#174#171#164#166#237#239#231#225#172#168#226#236
    + #161#238#241#137#150#147#138#133#141#131#152#153#135#149#154
    + #148#155#130#128#143#144#142#139#132#134#157#159#151#145#140
    + #136#146#156#129#158#240#252
    ;
  koi8: pChar =
  #202#195#213#203#197#206#199#219#221#218#200#223#198#217#215#193
    + #208#210#207#204#196#214#220#209#222#211#205#201#212#216#194#192
    + #163
    + #234#227#245#235#229#238#231#251#253#250#232#255#230#249#247#225
    + #240#242#239#236#228#246#252#241#254#243#237#233#244#248#226#224
    + #179
    ;


function replace_it(CString: PChar; scr: PChar; dest: PChar): PChar;
function latrus(CString: PChar): PChar; stdcall;
function rupper(CString: PChar): PChar; stdcall;
function rlower(CString: PChar): PChar; stdcall;
function dos2win(CString: PChar): PChar; stdcall;
function win2dos(CString: PChar): PChar; stdcall;
function koi82win(CString: PChar): PChar; stdcall;
function koi82dos(CString: PChar): PChar; stdcall;
function dos2koi8(CString: PChar): PChar; stdcall;
function win2koi8(CString: PChar): PChar; stdcall;
function UDF_strcat(dest, source: pchar): pchar; stdcall;


implementation

function replace_it(CString: PChar; scr: PChar; dest: PChar): PChar;

var
  i, j: integer;
begin
  i := 0;
  while (CString[i] <> #0) do
  begin
    j := 0;
    while (scr[j] <> #0) do
    begin
      if CString[i] = scr[j] then
      begin
        CString[i] := dest[j];
        Break;
      end;
      inc(j);
    end;
    inc(i);
  end;

  result := CString;
end;

function latrus(CString: PChar): PChar; stdcall;
begin
  result := replace_it(CString, lat_chars, rus_chars);
end;

function rupper(CString: PChar): PChar; stdcall;
begin
  result := replace_it(CString, small_chars, cap_chars);
end;

function rlower(CString: PChar): PChar; stdcall;
begin
  result := replace_it(CString, cap_chars, small_chars);
end;

function dos2win(CString: PChar): PChar; stdcall;
begin
  result := replace_it(CString, cp866, cp1251);
end;

function win2dos(CString: PChar): PChar; stdcall;
begin
  result := replace_it(CString, cp1251, cp866);
end;

function koi82win(CString: PChar): PChar; stdcall;
begin
  result := replace_it(CString, koi8, cp1251);
end;

function koi82dos(CString: PChar): PChar; stdcall;
begin
  result := replace_it(CString, koi8, cp866);
end;

function dos2koi8(CString: PChar): PChar; stdcall;
begin
  result := replace_it(CString, cp866, koi8);
end;

function win2koi8(CString: PChar): PChar; stdcall;
begin
  result := replace_it(CString, cp1251, koi8);
end;

function UDF_strcat(dest, source: pchar): pchar; stdcall;
begin
  result := strcat(dest, source);
end;

end.


А для IBConnection... у мня FB 2.1 он сам всё конвертит
Аватара пользователя
Inferno
новенький
 
Сообщения: 78
Зарегистрирован: 20.03.2009 14:40:20
Откуда: Тюмень

Re: кодировки в dbf, fb

Сообщение QuAzI » 11.06.2009 13:12:18

Спасибо огромное!

Добавлено спустя 6 часов 25 минут:
Не... это что-то невообразимое.
Наткнулся в сорсах на компонентину для работы с Paradox. Подключил lpk, пересобрал всё, стрипнул.
Почему-то он упорно считает что InputEncoding совпадает с TableName. pxlib пришлось качать из инета. Он в свою очередь попросил iconv.dll, которая около мегабайта весит. И вот у меня есть 17-мегабайтный косяк.
Он понял какую в какую кодировки конвертать... но выдал мне куцый хлам, смотрите в аттаче. Причём вот эти недоперекодировавшиеся хвосты в полях ещё и меняются, если таблицу пролистать и потом вернуться назад.
А видели бы вы его установленным на FreeBSD из портов и запущенным из awesome, вообще бы дара речи лишились :lol:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
QuAzI
незнакомец
 
Сообщения: 6
Зарегистрирован: 09.06.2009 21:14:55

Re: кодировки в dbf, fb

Сообщение alexs » 12.06.2009 03:45:22

QuAzI писал(а):Наткнулся в сорсах на компонентину для работы с Paradox

Вобщето, кроме BDE никто не умеет нормально работать с парадоксом. Так что не советую с ним связываться. Уж лучше с DBF.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4053
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: кодировки в dbf, fb

Сообщение QuAzI » 12.06.2009 08:41:57

Возможно, если бы весь софт в организации писал я, там бы и винды давно бы небыло. А сейчас там есть dBase (FoxPro for dos), FoxBase (Visual FoxPro), 1С, Paradox, FireBird, Interbase, PervasiveSQL, Btrieve и в цертральном филиале Oracle и MySQL.
С Lazarus у меня были надежды перетащить хотябы часть всего этого на юниксовые ОС, заодно переписав немного то, что уже никто не поддерживает. FireBird у меня на FreeBSD крутится серверная часть например.
QuAzI
незнакомец
 
Сообщения: 6
Зарегистрирован: 09.06.2009 21:14:55


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

Рейтинг@Mail.ru