Kyriet Temat założony przez niniejszego użytkownika |
Polskie znaki w konsoli... po raz setny » 2014-01-19 00:27:41 Witam, Jestem świadomy, że tematów na ten temat jest HOHO, a w każdym napisane co innego (na temat polskich znaków w konsoli). Zdziwił mnie fakt, że raz podaje ktoś kod na 30 linijek, a drugim razem na 5. Czy aby rzeczywiście na obecnym poziomie rozwoju technologicznego i komputerowego nie istniała opcja wyświetlania znaku takiego samego jak w kodzie źródłowym? (W kodzie mimo, że jest zapisane 'ą' i my to widzimy, nasz notatnik też, ale konsola nie :/ ) Co ciekawe, gdy za pomocą strumienia std::cin >> tekst wpiszemy przykładowo: "szkółka", to po wywołaniu std::cout << tekst co zobaczymy ? No właśnie, napis: "szkółka". Zapewne wynika to z różnic między kodowaniem znaków w konsoli albo innych skomplikowanych rzeczy, których nigdy nie zrozumiem, ale zbliżając się do końca mojej wypowiedzi zadam proste pytanie: Dlaczego nie istnieje jeden, banalny i wszędzie działający sposób wyświetlania polskich znaków. Jeżeli przetrwałeś do tej pory to mam prośbę. Proszę, abyście skompilowali poniższy kod i napisali, czy wam wypisuje polskie znaki. Mi osobiście ten sposób działa, a korzystam z Visual Studio 2012 Express for Desktop. Ale w tym momencie po wczytaniu przez strumień "szkółka" już nie wyświetli go poprawnie - Ręce opadają... Napiszcie też na jakim programie był kompilowany. Z góry dziękuję za odpowiedzi. #include <iostream> #include <conio.h>
int main() { setlocale( LC_ALL, "" ); std::cout << "ąćęłńóśżźĄĆĘŁŃÓŚŻŹ" << std::endl; _getch(); return 0; } Wyjście z programu na Visual Studio Express 2012 ąćęłńóśżźĄĆĘŁŃÓŚŻŹ Sęk w tym, że chcę wiedzieć, gdzie to działa, a gdzie nie działa. I czy jeżeli zapiszę program do .exe to jeżeli na moim komputerze się wyświetla, na innych komputerach również będzie ? Pozdrawiam. PS Jedyną opcją jaką znalazłem jest przeskakiwanie, jeżeli chcę wypisać tekst zapisany z kodu to muszę przed tym wstawić setlocale(LC_ALL,"Polish"); , a jeżeli chcę wypisać na ekran tekst wprowadzony przez użytkownika to: setlocale(LC_ALL,"C"); . Trochę z tym zabawy, ale to jedyny sposób, który ogarniam (w porównaniu z 30-sto linijkowymi kodami to wyświetlania polskich znaków, a w tym jakieś argumenty i inne rzeczy, których się nie rozumie... |
|
MrPoxipol |
» 2014-01-19 10:34:53 Ustawia locale na systemowe. http://www.cplusplus.com/reference/clocale/setlocale//edit: #include <iostream> #include <string>
int main() { setlocale( LC_ALL, "pl_PL" ); std::cout << "ąćęłńóśżźĄĆĘŁŃÓŚŻŹ" << std::endl; std::string a; std::getline( std::cin, a ); std::cout << a << std::endl; return 0; }
GCC 4.8.1, Linux Debianopodobny - działa. michal@michal-E1-571G:~/Pulpit$ g++ test.cpp -otest -O2 michal@michal-E1-571G:~/Pulpit$ ./test ąćęłńóśżźĄĆĘŁŃÓŚŻŹ Zażółć gęślą jaźń. Zażółć gęślą jaźń.
/edit: z tego co zauważyłem, gnome-terminal ma ustawione kodowanie znaków na UTF-8, więc musisz sam sprawdzić czy będzie działać :v. |
|
Kyriet Temat założony przez niniejszego użytkownika |
» 2014-01-19 12:34:34 #include <iostream> #include <string>
int main() { setlocale( LC_ALL, "pl_PL" ); std::cout << "ąćęłńóśżźĄĆĘŁŃÓŚŻŹ" << std::endl; std::string a; std::getline( std::cin, a ); std::cout << a << std::endl; return 0; } Wynik z tego programu to: ╣Šŕ│˝ˇť┐čąĂ╩úĐËî»Ć Szkółka Szkółka Natomiast gdy zastąpię setlocale( LC_ALL, "pl_PL" ); na setlocale( LC_ALL, "" ); , to wynik będzie następujący: ąćęłńóśżźĄĆĘŁŃÓŚŻŹ Szkółka Szk˘?ka Jak widać nie mogę znaleźć złotego środka, albo źle wyświetla z kodu, albo źle wyświetla wprowadzone dane. Ale mam jeszcze jedno pytanie, ponieważ tobie wyświetla w obu przypadkach poprawnie, ale korzystasz z innego kompilatora, więc gdybyś wysłał mi plik .exe z tym programem, to u mnie wyświetliłoby również tak jak tobie ? |
|
pekfos |
» 2014-01-19 12:54:22 Z wyświetlaniem polskich znaków w konsoli zawsze były problemy i pewnie zawsze będą. Zależy to od kodowania znaków, czcionek i paru innych rzeczy.. Dane z różnych źródeł mogą się różnić, mimo, że reprezentują tę samą informację. więc gdybyś wysłał mi plik .exe z tym programem |
PS: 5a 61 bf f3 b3 e6 20 67 ea 9c 6c b9 20 6a 61 9f f1 5a 61 be a2 88 86 20 67 a9 98 6c a5 20 6a 61 ab e4 Zmodyfikowałem powyższy program. Pierwsza linia to "Zażółć gęślą jaźń" wpisane w kodzie, a niżej wpisane przez użytkownika. Jak widać, polskie znaki różnią się kodowaniem. Tekst z kodu jest (w tym przypadku) kodowany w ANSI, a z konsoli chyba w Windows-1250. Konwertuj wszystkie dane na jeden sposób, by były wyświetlane poprawnie. Druga opcja, to zmienić stronę kodową w konsoli. |
|
Elaine |
» 2014-01-19 16:14:16 Tekst z kodu jest (w tym przypadku) kodowany w ANSI, a z konsoli chyba w Windows-1250. |
Pierwsze to Windows-1250, drugie to strona kodowa 852. |
|
DejaVu |
» 2014-01-19 17:36:05 Najlepszym rozwiązaniem jest pisanie aplikacji okienkowych, a nie konsolowych :) |
|
DejaVu |
» 2015-06-18 14:51:13 Poprawne wyświetlanie znaków Unicode pod Linuksem: #include <cstdio> #include <iostream>
int main() { setlocale( LC_ALL, "C.UTF-8" ); const wchar_t * text = L"Вітаю, шаноўны спадар!"; wprintf( L"printf wchar_t*: '%ls'\n", text ); wprintf( L"Hello world! ąćęłóżń\n" ); std::wcout << L"Hello world! ąćęłóżń\n" << text; return 0; }
|
|
« 1 » |