Poradil by mi nekdo jak toto vyresit ? Dekuji za kazdou informaci
Na vstupu je text v kodovani UTF-8. Predpokladejte, ze jeden znak muze byt ulozen na jednom az ctyrech bytech. Jednobytove znaky maji v nejvyssim bitu nulu, vicebytove znaky maji v prvinm bytu na nejvyssich radech tolik jednicek, kolikabytovy znak to je (napriklad tribytovy znak ma tento tvar: 1110xxxx 10xxxxxx 10xxxxxx). Prectete tento vstup a zjistete, kolik obsahuje znaku (nikoliv bytu).
const
jmeno_souboru = 'text49.txt';
Byte1_maska = $80; {1000 0000}
Byte2_maska = $C0; {1100 0000}
Byte3_maska = $E0; {1110 0000}
Byte4_maska = $F0; {1111 0000}
var F: text;
Znak: char;
PocetZnak: integer;
function jednoBajtovyZnak(Znak: char; bitmaska: byte): boolean;
begin
if (byte(Znak) and bitmaska) = 0 then jednoBajtovyZnak:=true
else jednoBajtovyZnak:=false
end;
function dvojBajtovyZnak(Znak: char; bitmaska: byte): boolean;
begin
if (byte(Znak) and bitmaska) = 192 then dvojBajtovyZnak:=true
else dvojBajtovyZnak:=false
end;
function triBajtovyZnak(Znak: char; bitmaska: byte): boolean;
begin
if (byte(Znak) and bitmaska) = 224 then triBajtovyZnak:=true
else triBajtovyZnak:=false
end;
function ctyrBajtovyZnak(Znak: char; bitmaska: byte): boolean;
begin
if (byte(Znak) and bitmaska) = 240 then ctyrBajtovyZnak:=true
else ctyrBajtovyZnak:=false
end;
begin
PocetZnak:=0;
Assign(F, jmeno_souboru);
Reset(F);
while eof(F) do begin
while not eoln(F) do begin
read(F, Znak);
if (jednoBajtovyZnak(Znak, Byte1_maska)) then
begin
inc(PocetZnak)
end
else if (dvojBajtovyZnak(Znak, Byte2_maska)) then
begin
read(F,Znak);
inc(PocetZnak)
end
else if (triBajtovyZnak(Znak, Byte3_maska)) then
begin
read(F,Znak);
read(F,Znak);
inc(PocetZnak)
end
else if (ctyrBajtovyZnak(Znak, Byte4_maska)) then
begin
read(F,Znak);
read(F,Znak);
read(F,Znak);
inc(PocetZnak)
end;
end;
readln;
end;
Close(F);
Writeln('Pocet znaku v souboru: ', PocetZnak);
end.
Zacal jsem resit tuto ulohu, ale vysledek ukazuje porad 0. Nevite kde je mozna chyba ?