Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Polskie znaki w konsoli... po raz setny

Ostatnio zmodyfikowano 2015-06-18 14:51
Autor Wiadomość
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.

C/C++
#include <iostream>
#include <conio.h>

int main()
{
    setlocale( LC_ALL, "" ); //Nie wiem co to robi, ale działa :P
   
    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...
P-102508
MrPoxipol
» 2014-01-19 10:34:53
C/C++
setlocale( LC_ALL, "" ); //Nie wiem co to robi, ale działa :P
Ustawia locale na systemowe.http://www.cplusplus.com​/reference/clocale/setlocale/

/edit:
C/C++
#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.
P-102512
Kyriet
Temat założony przez niniejszego użytkownika
» 2014-01-19 12:34:34
C/C++
#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 ?
P-102523
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
Linux Debianopodobny

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.
P-102526
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.
P-102546
DejaVu
» 2014-01-19 17:36:05
Najlepszym rozwiązaniem jest pisanie aplikacji okienkowych, a nie konsolowych :)
P-102551
DejaVu
» 2015-06-18 14:51:13
Poprawne wyświetlanie znaków Unicode pod Linuksem:
C/C++
#include <cstdio>
#include <iostream>

int main()
{
    // setlocale(LC_ALL, "pl_PL.UTF-8");
    // setlocale(LC_ALL, "en_US.UTF-8");
    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;
}
P-133731
« 1 »
  Strona 1 z 1