Włodzimierz Zylbertal

Włodzimierz Zylbertal badacz, wynalazca,
doradca,
popularyzator,
nauczyciel, pu...

Temat: Usuwanie polskich znaków ze String -a

Sądziłem, że prosta procedura

function BezPolskich(wej: AnsiString): String;
var
i: integer;
begin
for i:=1 to Length(wej) do
begin
if wej[i]='ą' then wej[i]:='a';
if wej[i]='Ą' then wej[i]:='A';
if wej[i]='ć' then wej[i]:='c';
if wej[i]='Ć' then wej[i]:='C';
if wej[i]='ę' then wej[i]:='e';
if wej[i]='Ę' then wej[i]:='E';
if wej[i]='ł' then wej[i]:='l';
if wej[i]='Ł' then wej[i]:='L';
if wej[i]='ń' then wej[i]:='n';
if wej[i]='Ń' then wej[i]:='N';
if wej[i]='ó' then wej[i]:='o';
if wej[i]='Ó' then wej[i]:='O';
if wej[i]='ś' then wej[i]:='s';
if wej[i]='Ś' then wej[i]:='S';
if wej[i]='ż' then wej[i]:='z';
if wej[i]='Ż' then wej[i]:='Z';
if wej[i]='ź' then wej[i]:='z';
if wej[i]='Ź' then wej[i]:='Z';
end;
BezPolskich:=(wej);
end;

zadziała. Ale nie działa, polskie znaki przechodzą przez nią nienaruszone, mimo wcześniejszej konwersji wejściowego łańcucha do Ansi poleceniem MojString:=UTF8ToAnsi(MojString);
No i głupi jestem. Jest w Sieci trochę takich procedur... ale wszystko pod Delphi, które nie stosuje UTF8 tak rygorystycznie jak Lazarus! Macie jakiś pomysł?

konto usunięte

Temat: Usuwanie polskich znaków ze String -a

W skrócie - debug. Trzeba odpalić w trybie krokowym, ustawić pułapkę i zobaczyć co tam jest - będzie wiadomo dlaczego nie działa. No i użyłbym http://lazarus-ccr.sourceforge.net/docs/rtl/strutils/s... - zamiast iterowania się samemu. No, ale to raczej szczegół.

konto usunięte

Temat: Usuwanie polskich znaków ze String -a

Rozwiązanie jest proste. Ta funkcja tutaj i te polskie znaki w niej są kodowane w UTF-8 (tak zakładam ale proszę sprawdzić). Zakładam że plik był edytowany w IDE Lazarusa. Trzeba po prostu ten plik .pas przekonwertować z UTF-8 na ANSI (Windows-1250) i tak go zapisać. String wejściowy przekazywany do funkcji musi być w Windows 1250.

Przed chwilą to sprawdzałem na prostej aplikacji konsolowej, plik .pas zapisałem jako kodowany w Windows-1250. Z tym UTF-8 to trzeba uważać. IDE Lazarusa zapisuje polskie znaki właśnie w tym standardzie, gdyby było inaczej to później do każdej kontrolki LCL trzeba by stosować konwersję SysToUTF8 i na odwrót przy odczycie a tak to się tylko prosto przypisuje ze stringa.

Starsze wersje Lazarusa nie miały UTF-8 tylko było Windows 1250. UTF-8 w LCL wprowadzili od którejś wersji, nie pamiętam dokładnie.

konto usunięte

Temat: Usuwanie polskich znaków ze String -a

Te if-y nie są dobrym pomysłem więc można by też inaczej:


//plik jest kodowany w Windows 1250
program convert;
{$mode objfpc}{$H+}

function AnsiToAscii(s: String): String;
const
ANSI: array[0..17] of char = ('ą', 'Ą', 'ć', 'Ć', 'ę', 'Ę', 'ł', 'Ł', 'ń', 'Ń', 'ó', 'Ó', 'ś', 'Ś', 'ź', 'Ź', 'ż', 'Ż');
ASCII: array[0..17] of char = ('a', 'A', 'c', 'C', 'e', 'E', 'l', 'L', 'n', 'N', 'o', 'O', 's', 'S', 'z', 'Z', 'z', 'Z');
var
i, j: integer;
begin
for i:=1 to Length(s) do
begin
for j := 0 to 17 do
begin
if s[i] = ANSI[j] then
begin
s[i] := ASCII[j];
break;
end;
end;
end;
result := s;
end;


var
s_ansi, s_ascii: string;
begin
s_ansi := 'ąĄćĆęĘłŁńŃóÓśŚźŹżŻ';
s_ascii := AnsiToAscii(s_ansi);
writeln(s_ascii);
end.


Wynik:

aAcCeElLnNoOsSzZzZTen post został edytowany przez Autora dnia 13.10.14 o godzinie 11:34
Włodzimierz Zylbertal

Włodzimierz Zylbertal badacz, wynalazca,
doradca,
popularyzator,
nauczyciel, pu...

Temat: Usuwanie polskich znaków ze String -a

Dzięki Wielkie! Po przeryciu dostępnych list dyskusyjnych i pogrzebaniu w Lazarus Wiki znalazłem udoskonalenie mojej procedury

uses LazUTF8;

function BezPolskich(wej: String): String;
var
i: integer;
Bufor, konec: String;
begin
konec:='';
for i:=1 to Length(wej) do begin
Bufor:=UTF8Copy(wej, i, 1);
if bufor='ą' then bufor:='a';
if bufor='Ą' then bufor:='A';
if bufor='ć' then bufor:='c';
if bufor='Ć' then bufor:='C';
if bufor='ę' then bufor:='e';
if bufor='Ę' then bufor:='E';
if bufor='ł' then bufor:='l';
if bufor='Ł' then bufor:='L';
if bufor='ń' then bufor:='n';
if bufor='Ń' then bufor:='N';
if bufor='ó' then bufor:='o';
if bufor='Ó' then bufor:='O';
if bufor='ś' then bufor:='s';
if bufor='Ś' then bufor:='S';
if bufor='ż' then bufor:='z';
if bufor='Ż' then bufor:='Z';
if bufor='ź' then bufor:='z';
if bufor='Ź' then bufor:='Z';
konec:=konec+bufor;
end;
result:=konec;
end;

A swoją drogą przebijanie się przez odmienności dobrze oswojonego Delphi i Lazarusa, który jest narzędziem wcale potężnym, dokumentację ma, owszem, nienajgorszą, ale jest niekomercyjny, więc spychany na margines uwagi "poważnych" form programistycznych - ma coś z pionierskich przygód pierwszych zdobywców...

konto usunięte

Temat: Usuwanie polskich znaków ze String -a

Albo jeszcze lepiej:


function AnsiToAscii(s: String): String;
const
ANSI: array[0..17] of char = (#185, #165, #230, #198, #234, #202, #179,
#163, #241, #209, #243, #211, #156, #140,
#159, #143, #191, #175);
ASCII: array[0..17] of char = ('a', 'A', 'c', 'C', 'e', 'E', 'l', 'L',
'n','N', 'o', 'O', 's', 'S', 'z', 'Z',
'z', 'Z');
var
i, j: integer;
begin
for i:=1 to Length(s) do
begin
for j := 0 to 17 do
begin
if s[i] = ANSI[j] then
begin
s[i] := ASCII[j];
break;
end;
end;
end;
result := s;
end;


To ostatecznie zlikwiduje problem związany z tym w jakim standardzie mają być zapisane pliki .pas.Ten post został edytowany przez Autora dnia 13.10.14 o godzinie 14:12

konto usunięte

Temat: Usuwanie polskich znaków ze String -a

Włodzimierz Z.:
A swoją drogą przebijanie się przez odmienności dobrze oswojonego Delphi i Lazarusa, który jest narzędziem wcale potężnym, dokumentację ma, owszem, nienajgorszą, ale jest niekomercyjny, więc spychany na margines uwagi "poważnych" form programistycznych - ma coś z pionierskich przygód pierwszych zdobywców...

No nie jest tak źle:
http://wiki.freepascal.org/Projects_using_Lazarus

Tylko że przejście na to środowisko z komercyjnego DELPHI może sprawiać problemy.
Mariusz Bułkowski

Mariusz Bułkowski W tajnej służbie Jej
Królewskiej Mości

Temat: Usuwanie polskich znaków ze String -a

Z tekstem zawsze jest problem bo często sie zapomina o pułapkach , podstawowy problem to kodowanie , bo tekst to sprawa umowna to ze widzimy "Ą" to nie znaczy ze ktoś inny tez to tak zobaczy

Proszę zobaczyć to
https://pl.wikipedia.org/wiki/Kodowanie_polskich_znak%C...

Autorowi watku proponuje pobawienie sie debugerem i breakointami
Jak nie wiesz o co chodzi to zadaj pytanie to wyjaśnię
Jarosław Ostrowski

Jarosław Ostrowski coś ala informatyk

Temat: Usuwanie polskich znaków ze String -a

Polecam bibliotekę Synapse a konkretnie moduł SynaChar i funkcję CharsetConversion

http://synapse.ararat.cz/doc/help/

Używam od dawna, jak też i pozostałych elementów.

Następna dyskusja:

Wrażenia z polskich pól




Wyślij zaproszenie do