PDA

Pogčedajte punu verziju : [C++] Unicode je horor


morando
24. 04. 2011., 14:20
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:

#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;
}

što znači da mi ne treba unicode ako bih aplikacije suzio samo na engleski i srpski jezik.?
Tako da bih za sad ostao na ovom ANSI-ju dok ne skapiram ovo drugo, mada me samo plaši text sa ove stranice (http://msdn.microsoft.com/en-us/library/dd317756%28v=VS.85%29.aspx):

ANSI code pages can be different on different computers, or can be changed for a single computer, leading to data corruption. For the most consistent results, applications should use Unicode, such as UTF-8 or UTF-16, instead of a specific code page.

Kako da, i šta da podesim da mi ovo funkcioniše sa "setlocale" funkcijom ako je moguće? a da ostanem na ANSI-ju.
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.

morando
24. 04. 2011., 15:50
Da dodam, pogledajte desni prozor na screenshot-u:
http://img195.imageshack.us/img195/7924/localset.jpg
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?

Dragi Tata
24. 04. 2011., 16:59
Ех, својевремено сам написао баш симпатичан увод у Јуникод али не знам да ли сад негде може да се нађе с обзиром да је сајт на коме је хостован у међувремену угашен.

Улавном, можда није лоша идеја да почнеш одавде: http://www.joelonsoftware.com/articles/Unicode.html

Ако ништа друго, бар ћеш да видиш колико је то компликована тема :D

morando
24. 04. 2011., 18:15
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. :1089::lost:

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.

morando
24. 04. 2011., 19:47
Imam jos jedno pitanje. :D
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?:1089:

Dragi Tata
25. 04. 2011., 01:15
UTF-8 енкодован текст можеш да држиш у обичном std::string објекту. Наравно, мораш да будеш свестан да један char значи 1 бајт, а не једно слово, али то је ионако већ случај и у другим мултибајт енкодним шемама.

За манипулисање UTF-8 текстом из С++а, погледај ову малу и једноставну библиотеку (библиотека је доста популарна, мада аутору не бих дао ни овце да чува :D ) http://utfcpp.sourceforge.net/

Што се тиче механизама стандардне С++ библиотеке: стримови, локали, итд, то ваљда Свевишњи разуме, а мени смртнику не пада на памет да се тиме бакћем :)

degojs
25. 04. 2011., 02:05
Evo kopije teksta "Uvod u Unicode", zakačio sam html fajl.

jablan
25. 04. 2011., 07:54
Znam da nije tema, ali C++ definitivno ne bih preporučio programeru hobisti.

morando
25. 04. 2011., 10:19
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.:1073:
@jablan
Ja sam mazohista, uvek mi je nešto više slađe kad ga teže dobijem.:D

Dragi Tata
25. 04. 2011., 17:26
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.:1073:


Чисто да не буде забуне: кад поставиш "Use uniocode char set" то значи да Windows API функције примају текст као UTF-16 енкодован wchar_t*. Ако се тиме бавиш, онда је најбоље да користиш wstring објекте. Имао сам утисак да питаш како да манипулишеш UTF-8 стринговима, а за то је одговор библиотека коју сам поменуо.