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 ;
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.
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:
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:
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.
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
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.
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
vBulletin® v3.8.7, Copyright ©2000-2024, vBulletin Solutions, Inc.