Šta je novo?

Rad sa unicode karakterima u Visual C++ 2013

Chupo

Slavan
Učlanjen(a)
02.12.2007
Poruke
2,872
Poena
380
Imam neki projekat za fakultet, gde treba da iz velikog broja fajlova čitam podatke (informacije o lekovima), i da sa tim podatcima kasnije manipulišem u smislu pretrage i poređenja.

Aplikacija koju sam napravio funkcioniše odlično sa ASCII karakterima, ili sa ANSI enkodiranjem (to je valjda isto što i ASCII) ali ako je fajl zapisan u unicode formatu, konkretno UTF8 onda aplikacija ne funkcioniše kako treba, od toga da ništa korisno ne pročita iz fajla, do toga da neće rezultate u konzoli da ispisuje.

Rešenje bi bilo da fajlove konvertujem u ASCII set karaktera, ali imam 2500 fajlova, i taj posao ručno bi bio robija. Ako postoji neki program koji to može da uradi za mnogo fajlova automatski, predložite ga.

E sad, pitanje, postoje li neke funkcije, biblioteke i slično za rad sa Unicode formatom (iostream tokovi rade lepo sa char podatcima, sa wchar_t je sve nepredvidivo)?

I za kraj, zbog čega wcout ne ispisuje ništa u konzoli, iako kad debagujem aplikaciju i pratim niz karaktera on se prikazuje ispravno, međutim na konzoli ništa_
 
Podesi projekat da bude unicode. Proveri da li fajlovi na pocetku imaju BOM marker (hex editor) i ne koristi char, vec wchar i std::wstring.
Io klase bi trebalo da utf8 fajlove konvertuju u unicode wchar prilikom učitavanja.
 
U tome i jeste problem, sve std::iostream funkcije i operatori ne prepoznaju rad sa wstring/wchar_t promenljivim.

Kako mogu da podesim ceo projekat da bude UTF8?

Fajlovi nemaju BOM, zato sto ako ih ucitavam kao char[], odma se ispisuje prvi znak,jer je uvek na pocetku fajla karakter kodiran u aski formatu (znam da je unicode "nastavak" na aski set karaktera).

Nasao sam neku funkciju koja niz u char* formatu konvertuje u wstring, ali se opet lose ispisuje u konzoli, a i nezgodna mi je obrada u wstring formatu, jer nemogu da dinamicki zauzimam koliko mi treba karaktera, a na 2500 fajlova to zna da bude stotinu i kusur megabajta.

Koje klase/funkcije po difoltu rade sa wchar_t karakterima, i koje ih "glat" ucitavaju iz fajlova?

PS. probao sam da koristim i wprintf, medjutim rezultat je isti kao i sa wcout.
 
Ja licno iostream ne koristim jer je spor. fopen("filename.ext", "rt, ccs=utf-8") bi trebalo da otvori file kao utf8.. https://msdn.microsoft.com/en-us/library/yeby3zcb.aspx

Dalje, koristi w verzije funkcija za read/write. Iako je file u originalu utf8, podaci ce biti konvertovani u unicode. Zauzece memorije je duplo vece.
 
Poslednja izmena:
Ajde okači negde file koji učitavaš da pogledam.
 
Posle par sati majanja oko debagovanja aplikacije sam shvatio da se meni stringovi sve vreme pravilno ucitavaju iz fajlova, problem je medjutim u tome sto ih ni wprintf, ni wcout a tek cout ne prikazuju kako treba u konzoli. Znakovi koji ne pripadaju ASCII tabeli se prikazuju kao dva znaka (najcesce neki random garbage).

Gde gresim?
 
Јел можеш да користиш QString и QTextStream? По мени то је много боља опција него стандардни ц++.
 
U wprintf koristi %S (veliko S)
 
Nazad
Vrh Dno