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

čtení vstupu v UTF-8 – Pascal – Fórum – Programujte.comčtení vstupu v UTF-8 – Pascal – Fórum – Programujte.com

 

Petr Zakopal
~ Anonymní uživatel
13 příspěvků
18. 1. 2013   #1
-
0
-

Dobrý den,

mám za úkol přečíst vstup v kódování UTF-8. Mám ho rozsekat na jednotlivá písmena a binární hodnoty těchto písmen uložit do stringů v nějaké struktuře. Struktury zvládám, ale problém je s prvními dvěma kroky. UTF-8 nejde přečíst pomocí read(), tedy jde, ale v případě, kdy mám například znak "Š" nepřečtu ho celý, protože má dva bity. Druhým problémem je, že nevím jak dostat z charu jeho binární hodnotu. Mohl by mi s tím někdo pomoci?

Nahlásit jako SPAM
IP: 94.112.188.–
zlz
~ Anonymní uživatel
634 příspěvků
18. 1. 2013   #2
-
0
-

Číselnou hodnotu charu získáš funkcí ord. To ale k ničemu nepotřebuješ.

Budeš číst řadu bajtů. Kolik bajtů načíst a které bity použít, abys načetl celý znak, zjistíš z popisu kódování UTF-8.

Hodnoty těch bajtů můžeš převést na číslo ve dvojkové soustavě (což se pravděpodobně rozumí tou binární hodnotou) klasicky zjišťováním podílu a zbytku dělení, nebo testováním hodnot jednotlivých bitů.

Viz. dokumentace k operátorům div, mod, and, shr, shl, funkcím odd, trunc, apod. jak je libo.

Nahlásit jako SPAM
IP: 78.156.159.–
zlz
~ Anonymní uživatel
634 příspěvků
18. 1. 2013   #3
-
0
-

Kecám, to čtení vstupu v pascalu vlastně funguje trochu jinak, asi by šlo číst přímo ty bajty, ale bude jednodušší číst ty chary a prohánět je přes ord.

Nahlásit jako SPAM
IP: 78.156.159.–
Petr Zakopal
~ Anonymní uživatel
13 příspěvků
18. 1. 2013   #4
-
0
-

stejně to pořád moc nechápu. řekněme že mám X: char; do tohoto charu uložím hodnotu například X:= "s". Potom mám promenou retez: String a já chci udelat proceduru, která mi do promenne retez vlozí hodnotu "01110011" což je binární hodnota znaku "S". Je toto srozumitelnější? 

Nahlásit jako SPAM
IP: 94.112.188.–
Mircosoft+1
Věrný člen
18. 1. 2013   #5
-
0
-

Přetypováním charu na byte (nebo funkcí Ord) získáš číselnou hodnotu znaku (tedy ASCII kód). Převod čísla do dvojkové soustavy vypadá nějak takhle:

číslo:=jeden byte ze vstupu
výsledek:=prázdný řetězec
cyklus pro všechny bity čísla (pro 1 B tedy osmkrát):
- jestli je číslo liché, připiš k výsledku zleva znak '1', jinak '0'
- číslo vyděl dvěma (nebo posuň o 1 bit doprava, to vyjde nastejno)

Nevím, jakým způsobem máš načítat ty unicodové texty. Z klávesnice to snad ani nejde (v TP určitě ne, u jiných překladačů nevím), takže bych čekal spíš vstup ze souboru. Každopádně to znamená čtení byte po bytu, rozbor každého bytu podle pravidel kódování Unicode a vždycky když získáš všechny byty jednoho písmena, jeden po druhém je převedeš do dvojkové soustavy a vypíšeš. O to, co je to ve skutečnosti za písmeno, se vůbec starat nemusíš. Pravidla UTF-8 máš tady: http://en.wikipedia.org/wiki/Utf-8#… .

Ty jednotlivé byty si můžeš ukládat do pole nebo po přetypování na char třeba do stringu. Převod na dvojkový tvar potom ještě zabalíš do cyklu "pro každý byte".

Nahlásit jako SPAM
IP: 212.118.224.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Petr Zakopal
~ Anonymní uživatel
13 příspěvků
18. 1. 2013   #6
-
0
-

Na úvod uvedu co jsem napsal:

program prog;
var F: text;
    C: char;
    S: string;
    I,X: Byte;
begin
  assign(F, 'txt.txt'); {znak "š" uložený v souboru v utf-8}
  reset(F);
  read(F, C);
  I:=ord(C);
  S:='';
  writeln(I);
  for X:=0 to 8 do begin
    S:=char(ord(odd(I)) + ord('0')) + S;
    I:=I shr 1; 
  end;
  writeln(S);
end.

Tak. Na vstupu mám znak 'š', což je znak s ordinální hodnotou větší než 127. Procedura read() přečte jenom první bit. Jeho ordinální hodnotu zpracuji, ale v prvním bajtu stejně nejsou jedničky (výsledek výše uvedeného kódu je:011000101). Jak je to možné? kde dělám chybu?

Nahlásit jako SPAM
IP: 94.112.188.–
KIIV
~ Moderátor
+43
God of flame
18. 1. 2013   #7
-
0
-

mozna bys mel pocitat jen od 0 do 7 ... bajty sou jen 8bitove

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Petr Zakopal
~ Anonymní uživatel
13 příspěvků
18. 1. 2013   #8
-
0
-

Ježiš já sem ocas :-D 3 dny nadávám, že něco nefunguje a nakonec je to v takové nepozornosi. Mnohokrát děkuji!

Nahlásit jako SPAM
IP: 94.112.188.–
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

čtení na vstupu — založil Kuba-$

čtení ze vstupu — založil gomess

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ý