PDA

Prikaži potpunu verziju : C++ string, iostream i naša latinica


Sass Drake
26.12.2010, 1:08
Pitanje je jednostvano: da li postoji način da se naša latinična slova pravilno unesu u ulaz i ispišu na izlaz? Uključujći i:
cout << "ščćžđ" << endl ;

voodoo_
26.12.2010, 1:47
Tehnički, trebalo bi izvorni fajl da snimiš kao unicode ili UTF-8, da ti ne bi pojeo naša slova i da se ne bi baktao sa sistemskim code pageovima. I pritom bi trebalo da koristiš wstring tip koji ćeš popuniti tekstom i poslati na cout. Nisam probao pa ne znam da li radi.

allokin
26.12.2010, 6:02
Mislim da ti treba prefix U ispred stringa.

Sass Drake
26.12.2010, 17:18
Hvala na savjetima, ali ne funkcioniše ni jedan način, a ni Google nije od pomoći kad mi stvarno treba. DevCPP 4.9.9.2 koristim.
Primjer:

#include <iostream>
#include <string>
using namespace std;

main ()
{
string rijec ;
cout << "Unesi riječ: " ; cin >> rijec ; //i da primi šđčćž
cout << "Riječ je " << rijec << endl ;
}


Da li neko zna šta tačno treba izmjeniti u kodu da mogu bez problema raditi sa našom latinicom? :n_klanja:

voodoo_
26.12.2010, 20:02
Pa običan string ne može da sadrži naša slova, treba ti "wide string" koji prima unicode znakove. Znači odatle polaziš.
A i zašto ne koristiš Visual C++ 2010, kad je besplatan a pritom je i mnogo bolji?

Sass Drake
26.12.2010, 20:31
Na labovima koristimo DevCPP koji je podešen tako da svi znakovi budu crne boje. S obzirom da sam već umoran od „junikodizacije izlaza i ulaza” tokom ovog vikenda, ovo ću da ostavim za zimsku pauzu jer i na faksu koristimo ćelavu latinicu na koju ja nikako ne mogu da se naviknem.
Isprobaću i Visual C++.
:odoK:

bvitnik
26.12.2010, 20:36
Hvala na savjetima, ali ne funkcioniše ni jedan način, a ni Google nije od pomoći kad mi stvarno treba. DevCPP 4.9.9.2 koristim.
Primjer:

#include <iostream>
#include <string>
using namespace std;

main ()
{
string rijec ;
cout << "Unesi riječ: " ; cin >> rijec ; //i da primi šđčćž
cout << "Riječ je " << rijec << endl ;
}


Da li neko zna šta tačno treba izmjeniti u kodu da mogu bez problema raditi sa našom latinicom? :n_klanja:

Windows-ov komandni prompt ne može da prikazuje naša slova kako god ona bila enkodovana a svakako ne podržava unikod. Unos unikod karaktera takođe nije podržan. Ispisivanje naših slova enkodovanih u UTF-8 bi eventualno radilo ako ispis preusmeravaš u fajl. Da bi sve radilo kako treba, moraš da razumeš kako funkcioniše enkodovanje karaktera u UTF-8 ili UTF-16. Stvar je poprilično komplikovana sa UTF-8 jer je to enkoding šema sa varijabilnom dužinom ali C++ string klasa može da se koristi. Tvoj problem je što praviš konzolski program i koristiš konzolu (terminal) koja ne "razume" unikod.

voodoo_
26.12.2010, 20:55
Nije problem u konzoli i terminalu, jer Windows NT (2000, XP, Vista, 7) sve stringove interno obrađuje kao unicode, a isto tako radi i cmd.exe.
Problem je u C++-u, jer u C# sve radi regularno.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.Write("Unesi tekst sa čćžšđ slovima: ");
string s = Console.ReadLine();
Console.WriteLine("Evo ga uneti tekst: " + s);
Console.ReadLine();
}
}
}

http://img443.imageshack.us/img443/7628/clipboard01is.jpg

bvitnik
26.12.2010, 21:42
Nije problem u konzoli i terminalu, jer Windows NT (2000, XP, Vista, 7) sve stringove interno obrađuje kao unicode, a isto tako radi i cmd.exe.
Problem je u C++-u, jer u C# sve radi regularno.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.Write("Unesi tekst sa čćžšđ slovima: ");
string s = Console.ReadLine();
Console.WriteLine("Evo ga uneti tekst: " + s);
Console.ReadLine();
}
}
}

http://img443.imageshack.us/img443/7628/clipboard01is.jpg

Bome kod mene jednostavno ne može da prikaže naše karaktere u comandnom promptu. Eksperimentisao sam malo sa fontovima. Izgleda da sve radi kako treba ako se koristi neki unikod font tipa Lucida Console. Moguće da su u Win 7 ovaj regularni font (Fixedsys ako se ne varam) u comandnom promptu proširili u ceo unikod set.

http://i52.tinypic.com/24g0z2v.png

Problem definitivno nije u jeziku jer C++ ionako ne mari za način na koji su enkodovani karakteri. Klase string i wstring se razlikuju samo u broju bajtova po karakteru i ne predviđaju nijedan konkretan način za enkodovanje karaktera.

Sudeći po ovom članku (http://www.codeproject.com/KB/stl/upgradingstlappstounicode.aspx?print=true), izgleda da implementacija STL-a koja dolazi uz VC++ kompajler pati od nekih problema pri upisu wstring-ova u fajlove jer vrši konverziju u string odnosno single byte karaktere.

Kako god okreneš, stvar oko wide character stringova je veoma komplikovana.

VojaM
26.12.2010, 23:56
Stvar bi mogla biti u samom podešavanju Windowsa. Sećam se da sam se jop kod Windowsa 98 nervirao što mi glupi Notepad ne radi kako treba. Tako isto u početku i na WIndowsu XP. A onda sam provalio ono "Language for non-Unicode programs". Ako tu staviš Serbian Latin, instaliraće se "produžena" verzija neproporcionalnih bitmapiranih sistemskih fontova (sa ekstenzijom .FON i ostalih) i problema više neće biti.

Sasvim je moguće da vam to pravi probleme. Naravno, ako pride nema i pokoji bag u kompajleru.

Sass Drake
27.12.2010, 0:11
Serbian Latin stavim kao non-Unicode tokom instalacije tako da to nije problem, ali kao što rekoh, ovim ću se ozbiljnije pozabaviti nakon Nove godine.

Belphegor
27.12.2010, 19:17
Problem uopste nije jednostavan, evo par zanimljivih linkova vezanih na temu:
http://www.joelonsoftware.com/articles/Unicode.html
http://www.flipcode.com/archives/Advanced_String_Techniques_in_C-Part_I_Unicode.shtml
http://www.metagraphics.com/index.htm?page=pubs/mgct_language-portable-code.htm