DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   Programiranje (http://www.devprotalk.com/forumdisplay.php?f=23)
-   -   [C++] Unicode je horor (http://www.devprotalk.com/showthread.php?t=9946)

morando 24. 04. 2011. 14:20

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

š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:
Citat:

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:

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

1 Prilog(a)
Evo kopije teksta "Uvod u Unicode", zakačio sam html fajl.

jablan 25. 04. 2011. 07:54

Off Topic: 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

Citat:

Originalno napisao morando (Napišite 97695)
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 стринговима, а за то је одговор библиотека коју сам поменуо.


Vreme je GMT +2. Trenutno vreme je 15:01.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.