24. 04. 2011. | #1 | |
nedovoljno naspavan
Na probnom radu
Datum učlanjenja: 25.03.2011
Poruke: 21
Hvala: 7
1 "Hvala" u 1 poruci
|
[C++] Unicode je horor
Pošto sam relativno početnik (programiranje mi dođe kao hobi), imam velikih problema oko razumevanja ANSI vs UNICODE i korišćenja raznih funkcija koje ih koriste (vezano za unos i iznos (kako da ga nazovem na srpskom)).
Dosta puta sam pretraživao po net-u o detaljima vezanim za Unicode, ali nigde nema konkretno objašnjeno (uprošćeno) ili naći nešto kodova/primera što je veoma teško, kao da su svi koji su pisali želeli da zvuče stručno (u očima drugih, kao da prave za njih same a ne za nekog početnika koji hoće da nauči/razume, mada je to nažalost slučaj i sa dosta drugih knjiga/tutoriala) ubacivali brdo zbunjujućih/komplikovanih stvari u takav text tako da se vraćam na sam početak po hiljadu puta. Pošto koristim vs 2010 express, uvek kad bih pravio neku aplikaciju isključivao bih opciju "Use unicode character set". Tek skoro sam "provalio" kako da podesim (iako je gore navedeno isključeno) da prikazujem/snimam podatke sa "našim" latiničnim slovima (npr. ŠĐČŽĆ), evo test koda: Kôd:
#include <iostream> #include <string> #include <fstream> #include <locale> int main() { setlocale(LC_ALL, ".1250"); std::string slova = "ŠĐČŽĆ"; std::cout << "Test slova u konzoli - " << slova << std::endl; std::ofstream out("out.txt"); out << slova; out.close(); std::ifstream in("out.txt"); in >> slova; in.close(); std::cout << "Test slova u konzoli - " << slova << std::endl; std::cout << "Press enter to exit..."; std::cin.get(); return 0; } Tako da bih za sad ostao na ovom ANSI-ju dok ne skapiram ovo drugo, mada me samo plaši text sa ove stranice: Citat:
Koji su to drugi kompjuteri i kako/gde bi neko ovo mogao da promeni? Ako ima neko ljubazan da mi pomogne, objasni i/ili iskopa neki link tipa "Unicode for dummies" ili bolje ako ima "Unicode for dumber then dummies" da bih ovo skapiro. Hvala puno unapred. |
|
24. 04. 2011. | #2 |
nedovoljno naspavan
Na probnom radu
Datum učlanjenja: 25.03.2011
Poruke: 21
Hvala: 7
1 "Hvala" u 1 poruci
|
Da dodam, pogledajte desni prozor na screenshot-u:
Koliko sam razumeo ovo bi trebalo da koriste programi koji su podešeni da ne korite unicode (kao što sam naveo u prvom postu o podešavanju u IDE-u što koristim) tako da bi ona slova trebalo da rade bez pozivanja funkcije "setlocale" iz mog primera, ali ipak NE radi!?! WTF? |
24. 04. 2011. | #3 |
dinosaurus
Master
Datum učlanjenja: 29.12.2005
Lokacija: Nova Engleska
Poruke: 636
Hvala: 79
263 "Hvala" u 66 poruka
|
Ех, својевремено сам написао баш симпатичан увод у Јуникод али не знам да ли сад негде може да се нађе с обзиром да је сајт на коме је хостован у међувремену угашен.
Улавном, можда није лоша идеја да почнеш одавде: http://www.joelonsoftware.com/articles/Unicode.html Ако ништа друго, бар ћеш да видиш колико је то компликована тема |
"Hvala" Dragi Tata za poruku: |
24. 04. 2011. | #4 |
nedovoljno naspavan
Na probnom radu
Datum učlanjenja: 25.03.2011
Poruke: 21
Hvala: 7
1 "Hvala" u 1 poruci
|
Hvala na linku. Elem, nekako sam "prežvakao" sav taj tekst i koliko sam razumeo neki danasnji standard je da se koristi utf8 sistem za enkodovanje (pored ostalih koji se manje koriste)
ali me sad buni kako bih recimo pročitao neki tekstualni fajl (koji je utf8 enk.) kada svaki karakter/slovo može biti od 1 - 6 byte-a, odnosno ušta da "uskladištim" tekst? char je 8 bit-a a wchar_t je 16 ??? Bar mislim da je tako, jer u nekim tekstovima sam pročitao da ne mora da znaci. Kad nađete vremena postavite još neki link ako ima vezano na temu jer bih stvarno želeo da skontam ovo i završim priču sa unicodom. Hvala unapred. |
24. 04. 2011. | #5 |
nedovoljno naspavan
Na probnom radu
Datum učlanjenja: 25.03.2011
Poruke: 21
Hvala: 7
1 "Hvala" u 1 poruci
|
Imam jos jedno pitanje.
Pretpostavljam da funkcija "setlocale" "deluje globalno" odnosno za taj program koji je poziva? A da li onda pozivanje funkcije "imbue" (postavlja locale) recimo na moj ofstream out važi samo za taj objekat? |
25. 04. 2011. | #6 |
dinosaurus
Master
Datum učlanjenja: 29.12.2005
Lokacija: Nova Engleska
Poruke: 636
Hvala: 79
263 "Hvala" u 66 poruka
|
UTF-8 енкодован текст можеш да држиш у обичном std::string објекту. Наравно, мораш да будеш свестан да један char значи 1 бајт, а не једно слово, али то је ионако већ случај и у другим мултибајт енкодним шемама.
За манипулисање UTF-8 текстом из С++а, погледај ову малу и једноставну библиотеку (библиотека је доста популарна, мада аутору не бих дао ни овце да чува ) http://utfcpp.sourceforge.net/ Што се тиче механизама стандардне С++ библиотеке: стримови, локали, итд, то ваљда Свевишњи разуме, а мени смртнику не пада на памет да се тиме бакћем |
"Hvala" Dragi Tata za poruku: |
25. 04. 2011. | #7 |
I'm a PC too.
Wrote a book
Datum učlanjenja: 05.06.2005
Lokacija: Kanada
Poruke: 1.354
Hvala: 82
130 "Hvala" u 89 poruka
|
Evo kopije teksta "Uvod u Unicode", zakačio sam html fajl.
__________________
Commercial-Free !!! |
2 članova zahvaljuje degojs za poruku: |
25. 04. 2011. | #9 |
nedovoljno naspavan
Na probnom radu
Datum učlanjenja: 25.03.2011
Poruke: 21
Hvala: 7
1 "Hvala" u 1 poruci
|
Ljudi hvala puno na trudu i pomoći.
@Tata Probaću ovu biblioteku što si mi predložio mada mi se na prvi pogled ne sviđa kako ona radi jer dosta funkcija (kada je podeseno "Use uniocode char set") traži kao parametar wchar_t (unsigned int) pa bih morao non-stop da radim konverziju "utf8::utf8to16" što pravi dodatne kopije teksta pa nije baš pogodno za aplikacije gde je brzina bitna, ali ću ipak da se malo zezam sa njom. @jablan Ja sam mazohista, uvek mi je nešto više slađe kad ga teže dobijem. |
25. 04. 2011. | #10 | |
dinosaurus
Master
Datum učlanjenja: 29.12.2005
Lokacija: Nova Engleska
Poruke: 636
Hvala: 79
263 "Hvala" u 66 poruka
|
Citat:
|
|
|
|