UTF-8 Pocet znaku – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

UTF-8 Pocet znaku – Pascal – Fórum – Programujte.comUTF-8 Pocet znaku – Pascal – Fórum – Programujte.com

 

sparky290
Návštěvník
19. 1. 2014   #1
-
0
-

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 ? 

Nahlásit jako SPAM
IP: 78.156.128.–
KIIV
~ Moderátor
+43
God of flame
19. 1. 2014   #2
-
0
-

nebude to tim, ze eof vraci true jen v pripade, kdyz je konec souboru?

Nahlásit jako SPAM
IP: 94.113.93.–
Program vždy dělá to co naprogramujete, ne to co chcete...
sparky290
Návštěvník
19. 1. 2014   #3
-
0
-

diky bylo potreba pred EOF dat NOT a u odradkovani chybelo logicke jmeno souboru

Nahlásit jako SPAM
IP: 78.156.128.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

Podobná vlákna

Pocet znaku — založil jeckop

(C++) Počet unikátních znaků v poli — založil richard.zavodny

Počet jednoho znaku v řetězci — založil Jake_Buchar

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý