free pascal utf8

Fórumok

Hogyan oldhatom meg az karaktersorozat ékezettelenítését free pascal-ban?
Íme a kód, csak épp a közepében lévő pozícióegyeztetés elhasal azon, hogy a az angol és a magyar változó nem egyforma hosszú. (szebb, behúzásos változat)


function ekezettelen(szoveg:string):string;
var magyar,angol: string;
f,m: Byte;

begin
m:=0;
magyar:='áéíóöőúüűÁÉÍÓÖŐÚÜŰ';
angol:= 'aeiooouuuAEIOOOUUU';

for f:=1 to length(szoveg) do begin
Write(szoveg[f]);
m:=pos(szoveg[f],magyar);
WriteLn(m,' ',szoveg[f],' ');
if (m<>0) then szoveg[f]:=angol[m];
m:=0;
end;

ekezettelen:=szoveg;
end;

begin
write(ekezettelen('Árvíztűrő tükörfúrógép'));
end.

Hozzászólások

elvileg de igen

(valamiért nem toom futtani:
egy.pas(8,58) Error: Identifier not found "rfReplaceAll"

a hívás meg ilyen:

uses strutils;
var egy,ketto: array [1..2] of string;
begin
egy[1]:='Egy-egy';
egy[2]:='Egy-kettő';
ketto[1]:='Kettő-egy';
ketto[2]:='Kettő-kettő';
WriteLn(StringsReplace('Egy-egy',egy,ketto,[rfReplaceAll]));
end.

azonban oktatási céllal kéne... szóval, azon felül, hogy mit rontok el most, érdekelne az eredeti kérdésre is a válasz..

Bár én nem használok FreePascal-t, de Delphi 2010-et igen, nem tudom van-e WideString típus ott, arra átkonvertálva (ami automatikus D2010 alatt) már működni kéne a pozícionálásnak, mivel abban a típusban fix hosszúságúak a karakterek. Vagy egy PWideChar tömbbe a következő függvénnyel: StringToWideChar().
Nem próbáltam ki, de erre tapogatóznék:

http://www.freepascal.org/docs-html/rtl/system/stringtowidechar.html

Üdv.

Attila, Perger
-----------------------------------------------------
"Az a szoftver, amelyiket nem fejlesztik, az halott!"

"már működni kéne a pozícionálásnak, mivel abban a típusban fix hosszúságúak a karakterek"
Nem megy sajnos, és asszem értem is, hogy miért: külön hasonlítja össze az első és a második bájtot.

még egy példa:

-------------------
var a: widestring;
begin
a:='Áá';
writeln('a hossza: ',length(a));
writeln('1:',a[1]);
writeln('2:',a[1],a[2]);
end.
-------------------

$./widestring
a hossza: 4
1:
2:Á

Hogy magyarázzam meg a pascalnak, hogy ha widestring, akkor két bájt egy betű, és innentől a stringkezelő függvényei dolgozzanak eszerint?:-)

Nem kell kidobni, mert az összehasonlítás szerintem jó lesz a típus miatt, csak a for ciklusban nem egyesével kell növelni a ciklusváltozót, hanem kettesével, azaz rendre: 1,3,5,....stb.

Így pl.: (nem értek a pascalhoz, tehát lehet, hogy másképpen is rá lehet venni a fort a kettesével való számolásra)


function ekezettelen(szoveg:string):string;
var magyar,angol: string;
f,m: Byte;

begin
m:=0;
magyar:='áéíóöőúüűÁÉÍÓÖŐÚÜŰ';
angol:= 'aeiooouuuAEIOOOUUU';

for f:=1 to length(szoveg) do begin
Write(szoveg[f]);
m:=pos(szoveg[f],magyar);
WriteLn(m,' ',szoveg[f],' ');
if (m<>0) then szoveg[f]:=angol[m];
m:=0;
f:=f+1;
end;

ekezettelen:=szoveg;
end;

begin
write(ekezettelen('Árvíztűrő tükörfúrógép'));
end.

Kérdés, hogy miért pascal és nem más nyelv ?

Megírhatod, de egyszerűbb lenne a ciklusváltozóddal kezdeni valamit, hogy kettesével lépkedjen...ha nincs pascalban aaz, amit írtam, akkor marad psc megoldása, while. Csak egyszerűbb a ciklust átírni pár perc alatt, mint újraírni a függvénykönyvtárat.

Persze te tudod...sajnos pascalt sosem használtam hála az istennek, ezért konkrét kódot nem tudok adni. :)

Föltelepítettem egy free pascalt és az alábbi kóddal jutottam eredményre:


function ekezettelen(szoveg: widestring): widestring;
var magyar: widestring;
angol: string;
f, m: byte;

begin
m := 0;
magyar := utf8decode('áéíóöőúüűÁÉÍÓÖŐÚÜŰ');
angol := 'aeiooouuuAEIOOOUUU';

for f := 1 to length(szoveg) do begin
Write(szoveg[f]);
m := pos(szoveg[f], magyar);
WriteLn(' <', m, '> ', szoveg[f], ' ');

if (m <> 0) then szoveg[f] := angol[m];

m := 0;
end;

ekezettelen := szoveg;
end;

begin
write(ekezettelen(utf8decode('Árvíztűrő tükörfúrógép')));
end.