[ pogubljen @ 06.01.2012. 00:28 ] @
Cao, nadam se da mi mozete pomoci. Zelim da iz fajla ucitam unicode tekst (utf-8) i da ga poredim karakter po karakter.
E sad, uspeo sam da ga ucitam, ali samo celog, tj. kad pokusam da ucitam karakter po karakter javljaju mi se na pocetku jedan znak i na kraju dva znaka koja nisu iz teksta, a izmedju su ispravni karakteri.

Ucitavam pomocu koda:
Code:

        wifstream literatura(ime.c_str());
        if(literatura.fail())
        {
            cout<<"\nGreska u otvaranju fajla '"<<ime<<"'"<<endl;
            return;
        }

        literatura.seekg(0, ios::end);
        long size = literatura.tellg();
        literatura.seekg(0, ios::beg);

        buffer= new wchar_t[size + 1];
        buffer[size] = '\0';
        literatura.read(buffer, size);

        wprintf(L"%s\n", buffer);

Zanima me da li postoji neki nacin da ucitavam karaktere bez tih “cudnih” znakova?

Unapred hvala
[ Mihajlo Cvetanović @ 06.01.2012. 10:19 ] @
Attachuj ovde fajl s kojim radiš. Nemoj ga prosto copy-paste nego preko dugmeta "Upload uz poruku".
[ pogubljen @ 06.01.2012. 13:37 ] @
Dodao sam uz prvi post, ako si na to mislio...

I samo da dodam da sam primetio, da mi se u stvari, na pocetku svskog citanja fajla javlja znak slican prompt-u
[ Mihajlo Cvetanović @ 06.01.2012. 14:06 ] @
Prva tri bajta u oba fajla su EF BB BF. To je takozvani Byte Order Mark, ili BOM, za UTF-8 tekst. BOM se koristi ponekad da označi u kom formatu je pisan tekst (UTF-8, ili UTF-16 BE, ili UTF-16 LE). Kad čitaš tekst od početka fajla onda u programu proveri da li su prva tri bajta EF BB BF, i ako jesu onda ih samo ignoriši, i ispiši ostatak teksta počevši od četvrtog bajta (sa ofsetom 3).

Za ostalo nisam siguran. Kažeš da imaš problem još samo sa krajem teksta, a da je između sve u redu. To mi je čudno. Trebalo bi da imaš problem sa svim našim slovima sa kukicama, a sa krajem da nemaš nikakav problem. Kako izgleda problem sa krajem teksta?
[ pogubljen @ 06.01.2012. 14:37 ] @
Sad sam shatio da ta dva problema nisu povezana, tj. znaci da nisam dobro ucitavao karaktere (size iz gornjeg koda je ostajao prevelik), pa su na kraju dodavani neki karakteri.

Aj molim te kazi mi na koji nacin mi je najlakse da ucitavam karakter po karakter, s obzirom da mi je to problem (do sad se i nisam setio da bi to mogao biti problem)
[ Mihajlo Cvetanović @ 06.01.2012. 15:43 ] @
Fora je u tome što UTF-8 format nije po defaultu podržan u wifstream, negom moraš da ga pridružiš. Funkcija se zove imbue i treba da je pozoveš odmah pošto napraviš stream objekat. Ovako nešto mora da stoji pre čitanja podataka: literatura.imbue(std::locale("..."));. Umesto tri tačke treba da stoji oznaka za UTF-8, ali ja ne znam koja je. Malo sam guglao, ali dobro su ih sakrili. Probaj ti da pronađeš, ili da eksperimentišeš. Pogledaj prihvaćen odgovor na pitanje na StackOverflow. Možda ovo radi:

Code:
literatura.imbue(std::locale(std::locale(), new utf8_codecvt_facet<wchar_t>));

[ pogubljen @ 06.01.2012. 17:32 ] @
Koliko sam ja video ovaj nacin radi na linux-u, tj. za gcc komajler, a ja radim na Windows-u sa CodeBlocks-om
[ Mihajlo Cvetanović @ 06.01.2012. 18:55 ] @
Ovo utf8_codecvt_facet se nalazi u Boost bibilioteci, i verovatno ga je odatle gcc preuzeo. Boost bibilioteku možeš da koristiš u Visual Studiu.
[ pogubljen @ 07.01.2012. 17:48 ] @
Hristos se rodi. Srecan Bozic svima

Shvatio sam da mi je najlaksi nacin da ucitavam slovo po slovo, ako ucitam utf8 bajtove i da proveravam po ovoj tabeli, ali imam samo jos jedan problem, da li mozes da mi kazes kako da citam bajtove
[ Mihajlo Cvetanović @ 07.01.2012. 19:23 ] @
Mislim da ručno čitanje bajt po bajt i konvertovanje po tabeli ne može nikako biti jednostavnije od korišćenja gotovih funkcija i gotovih biblioteka (koje verovatno rade istu stvar, samo efikasnije i bez grešaka). Kako bilo, da iz strima pročitaš jedan bajt možeš ovako:

Code:
unsigned char jedan_bajt;
literatura >> jedan_bajt;