Lazarus konwersja Mazowia na Windows

0

witam,
Napisałem program do konwersji Mazowia na Windows. Jego zasada działania polega na podmianie znaków ASCII w tablicy na litery polskie ąćę..., W delphi program działa prawidłowo, w Lazarusie nie rozpoznaje znaków w kodzie ASCII, wyświetla znaki zapytania, albo wcale np. dla Edit1.Text:=#143; . Problem tylko dotyczy znaków ASCII #143#149#144#156#165#163#152#160#161#134#141#145#146#164#162#158#166#167, w innych dekodowanie jest prawidłowe.
Ma ktoś pomysł jak to rozwiązać**?**

0

pokaż kod...

0

lazarus obsluguje utf-8, tak więc żeby poprawnie wyświetlało znaki musisz zmienić kodowanie tekstu na utf-8, np. Cp1250toUtf8 (moduł lconvencoding).

Pozdrawiam

0
paweld napisał(a):

lazarus obsluguje utf-8, tak więc żeby poprawnie wyświetlało znaki musisz zmienić kodowanie tekstu na utf-8, np. Cp1250toUtf8 (moduł lconvencoding).

Pozdrawiam

Zmieniając kodowanie

Edit1.Text:=AnsiToUtf8(#143#149#144#156#165);

Problem nadal nie rozwiązany. Oczywiście znaki wyświetla
Poniżej zamieszczam kod:

implementation

{$R *.lfm}
{ TForm1 }

const
  MazChars : string[ 18 ] = #143#149#144#156#165#163#152#160#161 +
                            #134#141#145#146#164#162#158#166#167;
  WinChars : string[ 18 ] ='ĄĆĘŁŃÓŚŹŻąćęłńóśźż';

  CodePage  = true;
var
  Maz2Win, Win2Maz: array [ char] of char;



procedure InitMaz2Win;
var
  c : char;
  i : integer;
begin
  for c := #0 to #255 do Maz2Win[ c] := c;

  Win2Maz := Maz2Win;

  for i := 1 to 18 do begin
    Maz2Win[ MazChars[ i]] := WinChars[ i];
    Win2Maz[ WinChars[ i]] := MazChars[ i];
  end;
end;


function TranslateStr( s: string): string;
var
  j, len: integer;
begin
    len := Length( s);
    for j := 1 to len do
    s[ j] := Maz2Win[ s[ j]];
    Result := s;
end;

 
0

polecam poczytać: http://wiki.lazarus.freepascal.org/LCL_Unicode_Support

co do rozwiązania:

 function TranslateStr(mazstr: string): string;
var
  utfstr: String;
  i: Integer;
begin
  utfstr:='';
  for i:=1 to Length(mazstr) do
  case mazstr of
  #143: utfstr:=utfstr+'Ą';
  #149: utfstr:=utfstr+'Ć';
  #144: utfstr:=utfstr+'Ę';
  #156: utfstr:=utfstr+'Ł';
  #165: utfstr:=utfstr+'Ń';
  #163: utfstr:=utfstr+'Ó';
  #152: utfstr:=utfstr+'Ś';
  #160: utfstr:=utfstr+'Ź';
  #161: utfstr:=utfstr+'Ż';
  #134: utfstr:=utfstr+'ą';
  #141: utfstr:=utfstr+'ć';
  #145: utfstr:=utfstr+'ę';
  #146: utfstr:=utfstr+'ł';
  #164: utfstr:=utfstr+'ń';
  #162: utfstr:=utfstr+'ó';
  #158: utfstr:=utfstr+'ś';
  #166: utfstr:=utfstr+'ź';
  #167: utfstr:=utfstr+'ż';
  else
  utfstr:=utfstr+mazstr[i];
  end; 
  Result:=utfstr;
end;
0

Dzięki za kod, problem nadal występuje. Kod ASCII jest nie dekodowany dla wybranych znaków. Czy może jest to wina kompilatora? Mam wersję 0.9.30.4.

0

proponuję zrobić tablicę 256 znaków tak spreparowaną że

znak_win := maz2win[znak_mazovia];
0
Azarien napisał(a):

proponuję zrobić tablicę 256 znaków tak spreparowaną że

znak_win := maz2win[znak_mazovia];

Pomysł dobry, tylko to nie będzie różnić się w znacznym stopniu od propozycji Paweła Dmitruka,
gdzie on selektywnie podmieniałkod ASCII na polskie znaki. Według mnie problem
jest w samym odwołaniu po kodzie ASCII, gdzie Lazarus nie rozpoznaje go prawidłowo
i wrzuca do string-a jako znak" ?".

1

Witam,
kod działa, tylko w poprzednim wystąpił mały błąd. Poprawiony:

function TranslateStr(mazstr: string): string;
var
 utfstr: String;
 i: Integer;
begin
 utfstr:='';
 for i:=1 to Length(mazstr) do
 case mazstr[i] of //tutaj wcześniej był cały string a nie jeden znak
 #143: utfstr:=utfstr+'Ą';
 #149: utfstr:=utfstr+'Ć';
 #144: utfstr:=utfstr+'Ę';
 #156: utfstr:=utfstr+'Ł';
 #165: utfstr:=utfstr+'Ń';
 #163: utfstr:=utfstr+'Ó';
 #152: utfstr:=utfstr+'Ś';
 #160: utfstr:=utfstr+'Ź';
 #161: utfstr:=utfstr+'Ż';
 #134: utfstr:=utfstr+'ą';
 #141: utfstr:=utfstr+'ć';
 #145: utfstr:=utfstr+'ę';
 #146: utfstr:=utfstr+'ł';
 #164: utfstr:=utfstr+'ń';
 #162: utfstr:=utfstr+'ó';
 #158: utfstr:=utfstr+'ś';
 #166: utfstr:=utfstr+'ź';
 #167: utfstr:=utfstr+'ż';
 else
 utfstr:=utfstr+mazstr[i];
 end;
 Result:=utfstr;
end;
5

Skoro ten kod działa to proponowałbym wykorzystać tablicę i zrobić coś takiego:

function MazowiaToWindows(AInputStr: string): string;
const
  CHARS: array [0..17,0..1] of Char = ((#143, 'Ą'), (#149, 'Ć'), {...uzupelnij dalej});
var
  i: Integer;
begin
  result:= AInputStr;
  for i:=Low(CHARS) to High(CHARS) do
    result:= StringReplace(result, CHARS[i][0], CHARS[i][1], [rfReplaceAll]);
end;
0
kAzek napisał(a):

Skoro ten kod działa to proponowałbym wykorzystać tablicę i zrobić coś takiego:

function MazowiaToWindows(AInputStr: string): string;
const
  CHARS: array [0..17,0..1] of Char = ((#143, 'Ą'), (#149, 'Ć'), {...uzupelnij dalej});
var
  i: Integer;
begin
  result:= AInputStr;
  for i:=Low(CHARS) to High(CHARS) do
    result:= StringReplace(result, CHARS[i][0], CHARS[i][1], [rfReplaceAll]);
end;

Dzięki kAzek za pomoc, temat uważam za zamknięty.

0

Jednak temat podnoszę, Wykorzystuję rozwiązanie kodowania zaproponowanego przez kAzek. Wszystko jest prawidłowo kodowane z polskimi literami w Edit, jak również w DBGrid. Problem pojawia się kiedy to zapisujemy do tablicy a następnie staramy się odczytać dane pole w tablicy. Pole to nadal pozostaje z symbolami ? w miejscu polskich liter. Funkcja zapisu i odczytu wykonuje się prawidłowo. Wersja lazarusa jaką obecnie posiadam to 1.0.8.
Może używam archaicznych tablic dbf. ale w takim formacie otrzymuję bazę.

0
pol2013 napisał(a):

Jednak temat podnoszę, Wykorzystuję rozwiązanie kodowania zaproponowanego przez kAzek. Wszystko jest prawidłowo kodowane z polskimi literami w Edit, jak również w DBGrid. Problem pojawia się kiedy to zapisujemy do tablicy a następnie staramy się odczytać dane pole w tablicy. Pole to nadal pozostaje z symbolami ? w miejscu polskich liter. Funkcja zapisu i odczytu wykonuje się prawidłowo. Wersja lazarusa jaką obecnie posiadam to 1.0.8.
Może używam archaicznych tablic dbf. ale w takim formacie otrzymuję bazę.

Tylko miesiąc zajęło ci stwierdzenie że ten kod nie jest poprawny? Nieźle...

Ja ci proponuję wytłumaczenie krok po kroku co zrobiłeś od początku do końca. Nikt nie pamięta detali twojego pytania sprzed miesiąca. Najlepiej to załóż nowy temat, będzie mniej burdelu...

I użyj kodu @Paweł Dmitruk , jego kod jest poprawny. Upewnij się także że masz dobre kodowanie plików (UTF-8 bez BOM).

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