Подскажите пож. такую функцию...
Задача выглядит следующим образом. В БД Firebird данные лежат в 1251. С ней надо работать в Лазаре в Линуксе.
Решил попробовать GTK2, перекодируя перед выводом данные в utf8.
			
		Модератор: Модераторы
tria писал(а):Подскажите пож. такую функцию...
Задача выглядит следующим образом. В БД Firebird данные лежат в 1251. С ней надо работать в Лазаре в Линуксе.
Решил попробовать GTK2, перекодируя перед выводом данные в utf8.
haword писал(а):посмотри в нутри файла lconv.pas в LCL
//Stupid code. Works anyway, but extra-slow
 {$ifdef Unix}
  SL:=TStringList.Create;
  SL.Text:=s;
  FN1:=GetTempFileName;
  SL.SaveToFile(FN1);
  FN2:=GetTempFileName;
  Shell('iconv -f '+from+' -t '+toC+'<'+FN1+' >'+FN2);
  SL.LoadFromFile(FN2);
  if SL.Text<>'' then  Result:=SL.Text else Result:=s;
  DeleteFile(FN1);DeleteFile(FN2);
{$endif}
Джентельмен писал(а):ага... и вы столкнулись с проблемой... а я когда то поднимал эту тему... пол инета перелопатил... кучу функций перепробывал... ну да ладно... если не забуду, завтра принесу и сброшу функцию кодирования... как раз для ваших целей... и решит вашу проблему... хотя... а нифига с собой нет... если не забуду завтра выложу...
unit Unit8;
{$mode objfpc}{$H+}
interface
const
 BASE_CHAR = 192;
 w2k : array[0..63] of Byte = (225, 226, 247, 231, 228, 229, 246, 250,
                               233, 234, 235, 236, 237, 238, 239, 240,
                               242, 243, 244, 245, 230, 232, 227, 254,
                               251, 253, 255, 249, 248, 252, 224, 241,
                               193, 194, 215, 199, 196, 197, 214, 218,
                               201, 202, 203, 204, 205, 206, 207, 208,
                               210, 211, 212, 213, 198, 200, 195, 222,
                               219, 221, 223, 217, 216, 220, 192, 209);
 k2w : array[0..63] of Byte = (254, 224, 225, 246, 228, 229, 244, 227,
                               245, 232, 233, 234, 235, 236, 237, 238,
                               239, 255, 240, 241, 242, 243, 230, 226,
                               252, 251, 231, 248, 253, 249, 247, 250,
                               222, 192, 193, 214, 196, 197, 212, 195,
                               213, 200, 201, 202, 203, 204, 205, 206,
                               207, 223, 208, 209, 210, 211, 198, 194,
                               220, 219, 199, 216, 221, 217, 215, 218);
                               
                               
                               
                               
OTA = #$01#$02#$03#$04#$05#$06#$07#$08#$09#$0A#$0B#$0C#$0D#$0E#$0F#$10+
       #$11#$12#$13#$14#$15#$16#$17#$18#$19#$1A#$1B#$1C#$1D#$1E#$1F#$20+
       #$21#$22#$23#$24#$25#$26#$27#$28#$29#$2A#$2B#$2C#$2D#$2E#$2F#$30+
       #$31#$32#$33#$34#$35#$36#$37#$38#$39#$3A#$3B#$3C#$3D#$3E#$3F#$40+
       #$41#$42#$43#$44#$45#$46#$47#$48#$49#$4A#$4B#$4C#$4D#$4E#$4F#$50+
       #$51#$52#$53#$54#$55#$56#$57#$58#$59#$5A#$5B#$5C#$5D#$5E#$5F#$60+
       #$61#$62#$63#$64#$65#$66#$67#$68#$69#$6A#$6B#$6C#$6D#$6E#$6F#$70+
       #$71#$72#$73#$74#$75#$76#$77#$78#$79#$7A#$7B#$7C#$7D#$7E#$7F#$C0+
       #$C1#$C2#$C3#$C4#$C5#$C6#$C7#$C8#$C9#$CA#$CB#$CC#$CD#$CE#$CF#$D0+
       #$D1#$D2#$D3#$D4#$D5#$D6#$D7#$D8#$D9#$DA#$DB#$DC#$DD#$DE#$DF#$E0+
       #$E1#$E2#$E3#$E4#$E5#$E6#$E7#$E8#$E9#$EA#$EB#$EC#$ED#$EE#$EF+
       #$80#$81#$82+
       #124#124#124#124#43#43#124#124#43#43#43#43#43#43+
       #43#43#124#45#43#124#124#43#43#43#43#124#45#43#43#43+
       #43#43#43#43#43#43#43#43#43#43+
       #$9B#$9C#$A6#$CC#$9D+
       #$F0+
       #$F1#$F2#$F3#$F4#$F5#$F6#$F7#$F8#$F9#$FA#$FB#$FC#$FD#$FE#$FF#$A8+
       #$B8#$F7#$BE#$B6#$A7#$9F#$B8#$B0#$A8#$B7#$B9#$B3#$B2#$9E#$A0;
 ATO = #$01#$02#$03#$04#$05#$06#$07#$08#$09#$0A#$0B#$0C#$0D#$0E#$0F#$10+
       #$11#$12#$13#$14#$15#$16#$17#$18#$19#$1A#$1B#$1C#$1D#$1E#$1F#$20+
       #$21#$22#$23#$24#$25#$26#$27#$28#$29#$2A#$2B#$2C#$2D#$2E#$2F#$30+
       #$31#$32#$33#$34#$35#$36#$37#$38#$39#$3A#$3B#$3C#$3D#$3E#$3F#$40+
       #$41#$42#$43#$44#$45#$46#$47#$48#$49#$4A#$4B#$4C#$4D#$4E#$4F#$50+
       #$51#$52#$53#$54#$55#$56#$57#$58#$59#$5A#$5B#$5C#$5D#$5E#$5F#$60+
       #$61#$62#$63#$64#$65#$66#$67#$68#$69#$6A#$6B#$6C#$6D#$6E#$6F#$70+
       #$71#$72#$73#$74#$75#$76#$77#$78#$79#$7A#$7B#$7C#$7D#$7E#$7F#$B0+
       #$B1#$B2#$B3#$B4#$B5#$B6#$B7#$B8#$B9#$BA#$BB#$BC#$BD#$BE#$BF#$C0+
       #$C1#$C2#$C3#$C4#$C5#$C6#$C7#$C8#$C9#$CA#$CB#$CC#$CD#$CE#$CF#$D0+
       #$D1#$D2#$D3#$D4#$D5#$D6#$D7#$F0#$D9#$DA#$DB#$DC#$DD#$DE#$DF#$F0+
       #$F1#$F2#$F3#$F4#$F5#$F6#$F7#$F1#$F9#$FA#$FB#$FC#$FD#$FE#$FF#$80+
       #$81#$82#$83#$84#$85#$86#$87#$88#$89#$8A#$8B#$8C#$8D#$8E#$8F#$90+
       #$91#$92#$93#$94#$95#$96#$97#$98#$99#$9A#$9B#$9C#$9D#$9E#$9F#$A0+
       #$A1#$A2#$A3#$A4#$A5#$A6#$A7#$A8#$A9#$AA#$AB#$AC#$AD#$AE#$AF#$E0+
       #$E1#$E2#$E3#$E4#$E5#$E6#$E7#$E8#$E9#$EA#$EB#$EC#$ED#$EE#$EF;
                               
                               
                               
                               
                               
function WinToK8R(const Text : String) : String;
function K8RToWin(const Text : String) : String;
function _ATO(SS: string): string; {Win1251 -  DOS866}
function _OTA(SS: string): string; {DOS866  - Win1251}
implementation
Uses
  Unit1, Unit2, Unit3, Unit4, Unit5, Unit6, Unit7, Unit9, Unit10;
function WinToK8R(const Text : String) : String;
var
  i : Integer;
begin
  Result := Text;
  for i := 1 to Length(Result) do
  if Result[i] >= Char(BASE_CHAR) then
  Result[i] := Char(w2k[Byte(Result[i])-BASE_CHAR]);
end;
function K8RToWin(const Text : String) : String;
var
  i : Integer;
begin
  Result := Text;
  for i := 1 to Length(Result) do
  if Result[i] >= Char(BASE_CHAR) then
  Result[i] := Char(k2w[Byte(Result[i])-BASE_CHAR]);
end;
function _ATO(SS: string): string;
var I: integer;
    SR: string;
begin
  SR:='';
  for I:=1 to Length(SS) do
    SR:=SR+ATO[Ord(SS[I])];
  Result:=SR;
end;
function _OTA(SS: string): string;
var I: integer;
    SR: string;
begin
  SR:='';
  for I:=1 to Length(SS) do
    SR:=SR+OTA[Ord(SS[I])];
  Result:=SR;
end;
end.function WinToK8R(const Text : String) : String; //1251->KOI8
function K8RToWin(const Text : String) : String; //KOI8->1251
function _ATO(SS: string): string; {Win1251 - DOS866} 
function _OTA(SS: string): string; {DOS866 - Win1251}Attid писал(а):посмотри как используется iconv тут
function iconv_open(__tocode:pchar; __fromcode:pchar):iconv_t;cdecl;external libiconvname name 'iconv_open'; 
function iconv(__cd:iconv_t; __inbuf:ppchar; __inbytesleft:psize_t; __outbuf:ppchar; __outbytesleft:psize_t):size_t;cdecl;external libiconvname name 'iconv'; 
function iconv_close(__cd:iconv_t):cint;cdecl;external libiconvname name 'iconv_close';
Attid писал(а):или посмотри что с перекодировкой есть тут
Сейчас этот форум просматривают: Yandex [Bot] и гости: 1