Kompilacja w C++,polskie znaki w konsoli

Nie odpowiedziałeś na żadne z moich pytań. Ale wpisałem w Google “cmd.exe polskie znaki” i znalazłem coś co powinno Cię zainteresować: http://ja5kier.blogspot.com/2007/05/utf-8-i-cmdexe.html

Oczywiście jedynie zakładam, że używasz cmd.exe, bo tego nie napisałeś, ani innych przydatnych informacji.

Sory za nieścisłość…ja mam problem że kompiluje w dev c++ 5 i wchodzę w ten plik exe klikając na niego-już to pisałem.Ja nie wiem co jeszcze byś chciał wiedzieć.Jeżeli chodzi Ci o to,że wchodzę w ten program przez start/uruchom/cmd to teraz już wiesz,że nie :smiley:

Nie, pytam się czy konsola której używasz to cmd.exe? Sprawdzałeś w jej ustawieniach czcionkę i kodowanie znaków? Spróbowałeś rady, do której podałem link (zmiana kodowania w cmd.exe oraz zmiana czcionki)?

Nie wiem jak sprawdzić :frowning:

Dodane Śr sty 21, 2009 9:06 pm

A co do konsoli to tak jest to konsola cmd.exe

Dodane Śr sty 21, 2009 9:08 pm

Co do tego linka to tam jest link do strony o tym chcp-lecz jak tam wchodzę to pisze,że nie ma takiego pliku do pobrania.

No pomyślmy… Jakie może być domyślne kodowanie w trybie tekstowym polskiej lokalizacji Windowsa, który to ma udawać DOS-a? Nie wpadłeś, że będzie to DOS Codepage 852? Użyj jakiegoś normalnego edytora (podpowiadam, że Dev-C++ nie posiada normalnego edytora) i zapisz plik w tym kodowaniu i dopiero wtedy go skompiluj. Zadziała.

PS Po co używasz conio.h? Toż to biblioteka rodem z DOS-a… Nie możesz użyć getchar() zamiast getch()?

Co do conio.h to nie wiem po co ona ale używam po tam mam w kursie;p.A co do polskich znaków…jak zapiszę w jakimś pliku tekstowym to jak to potem mam skompilować?Jakim plikiem.No bo w dev to tam jest opcja do kompilacji ale tak żeby dokument zkompilować to nie wiem czym.

Nie ma to jak samodzielne myślenie.

Zapisujesz do pliku *.cpp, otwierasz w IDE (domyślam się, że nadal korzystasz z Dev-C++) i kompilujesz. Nie wystrasz się, jeśli Dev polskie znaki wyświetli jako krzaczki. Windows to rozpozna. :wink:

Zasadniczo gcc.exe. Ale radzę skorzystać ze zwykłej opcji kompilacji.

S kompilować po pierwsze.

Jak to nie wiesz czym? Devem. :wink:

Drugim sposobem na poslkie znaki jest taki zapis:

*********

cout<<"Jaki\230 text.";

*********

Co wyświetla:

Jakiś tekxt.

Moore , nazwij proszę temat konkretnie…

Widzę że nikt nie potrafi odpowiedzieć na tak proste pytanie. Więc do rzeczy. Oczywiście jeśli skompilujemy program i uruchomimy pod konsolą - to zamiast polskich liter będziemy mieli krzaczki. Chodzi tutaj o strony kodowe (Strona kodowa - przyjęty w informatyce sposób na przypisanie poszczególnym kodom binarnym różnych znaków pisarskich.) Kiedy piszemy nasz kod - to kompilator używa strony kodowej 1250 (Central European - Windows), a kiedy uruchomiamy nasz program pod konsolą to jest używana strona kodowa 852 (Central European - DOS) - i dlatego mamy krzaczki.

Można to rozwiązać na dwa sposoby :x

  1. Na przykładzie kodu prostego programu

include

# include

using namespace std;

int main ()

{

locale myloc (“Polish”);

locale oldloc = locale::global (myloc);

cout << " To jest test - ąśżźćęł." << endl;

locale::global (oldloc);

cin.get ();

cin.get ();

return 0;

}


Na powyższym przykładzie (do kompilacji używałem darmowego Visual C++ Express Edition) widzimy że mamy dwa pliki nagłówkowe i . I właśnie żeby mieć polskie znaki musimy dodać plik locale ( patrz przykładowy program) oraz użyć “komend” przed tekstem który chcemy wyświetlić.

locale myloc (“Polish”);

locale oldloc = locale::global (myloc);

Później przed return 0; wstawiamy

locale::global (oldloc);


  1. Sposób - jeśli używasz Visual C++ Express Edition, Zapisz plik w innej stronie kodowej czyli 852. Załóżmy że masz otwarty swój projekt, skompilowałeś go i uruchomiłeś i masz w konsoli krzaczki. Kliknij File > Advanced Save Option. Ukaże ci się okno, w Encoding wybierz Central European - DOS - 852. Kliknij OK. Skompiluj projekt. =D> . Nie wiem jak jest w innych kompilatorach (IDE).

Czasami funkcja locale może nie zadziałać np jeśli używamy darmowego kompilatora Dev-C++ (http://www.bloodshed.net/devcpp.html) Wtedy musimy zmodyfikować nasz program używając funkcji CharToOem. Oto przykład


#include

#include

using namespace std;

int main ()

{

//przed konwersją

cout << “Przed: Zażółć gęślą jaźń” << endl;

//bufor musi zostac zaalokowany przed wywolaniem funkcji

static char bufor[32];

//konwersja CharToOem jest funkcją umożliwiającą konwersję napisu

// do standardu OEM, który także pozwala na wyświetlanie polskich

//znaków w konsoli DOS.

CharToOem( “Po: Zażółć gęślą jaźńzzzzzzzzzzzzzzz” , bufor );

cout << bufor << endl;

system(“PAUSE”);

return 0;

}


Mam nadzieje że to komuś pomoże ![-o<


Mój dalszy Update o polskich znakach w konsoli w Borlandzie C++ Builder i nie tylko, - kolejny sposób wywołania polskich znaków pod konsolą.

//------------------------------------------------------------------

include

using namespace std;

int main()

{

system(“chcp 1250”);

system(“cls”);

cout " To jest test polskich liter żźć";//

cin.get ();

return 0;

}

//------------------------------------------

Pojawi się nam czarne okno konsoli z wyświetlonym komunikatem “To jest test polskich liter…” Możemy nie zobaczyć polskich znaków. Nie zamykamy konsoli. Najeżdżamy na jej górny pasek i wciskamy prawy przycisk myszy. Pojawi się nam menu kontekstowe. Wybieramy - Właściwości - Czcionka. Wybieramy czcionkę Lucida Console. Rozmiar czcionki, okna ustawiamy według naszego gustu. Wybierając tą czcionkę teraz w Borland C++ Builderze będziemy mieli polskie znaki. ![-o<

Jak przyjdą mi jakieś dalsze pomysły co do polskich czcionek w konsoli to je dopiszę. To tyle.

:o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o :o

-------------------------------------------------KOLEJNE ROZWIĄZANIE---------------------------------------------------------------------------------------

#include

using namespace std;

//poprawnie wyswietla polskie znaki w konsoli

string PL(string znak)

{

for (unsigned i = 0; i znak.length(); i ++){

switch(znak_){_

case ‘ą’:

znak = static_cast(165);

break;

case ‘ć’:

znak = static_cast(134);

break;

case ‘ę’:

znak = static_cast(169);

break;

case ‘ł’:

znak = static_cast(136);

break;

case ‘ń’:

znak = static_cast(228);

break;

case ‘ó’:

znak = static_cast(162);

break;

case ‘ś’:

znak = static_cast(152);

break;

case ‘ź’:

znak = static_cast(171);

break;

case ‘ż’:

znak = static_cast(190);

break;

case ‘Ą’:

znak = static_cast(164);

break;

case ‘Ć’:

znak = static_cast(143);

break;

case ‘Ę’:

znak = static_cast(168);

break;

case ‘Ł’:

znak = static_cast(157);

break;

case ‘Ń’:

znak = static_cast(227);

break;

case ‘Ó’:

znak = static_cast(224);

break;

case ‘Ś’:

znak = static_cast(151);

break;

case ‘Ź’:

znak = static_cast(141);

break;

case ‘Ż’:

znak = static_cast(189);

break;

}

}

return znak;

}

-----------------------------------------------------------------

Powyższy plik możemy dołączyć do naszego projektu i zapisać go jako np polskie_znaki.h, lub po prostu uwzględnić go w naszym kodzie. Zawsze kiedy chcemy uzyskać polskie znaki musimy zdanie poprzedzić literami PL oraz umieścić w okrągłych nawiasach, jak na przykładzie- PL(“Nasz tekst z polskimi znakiami”); :o

Przykładowy program.

//--------------------------------------------------------------------------------------

#include

using namespace std;

//poprawnie wyświetla polskie znaki w konsoli

string PL(string znak)

{

for (unsigned i = 0; i znak.length(); i ++){

switch(znak_){_

case ‘ą’:

znak = static_cast(165);

break;

case ‘ć’:

znak = static_cast(134);

break;

case ‘ę’:

znak = static_cast(169);

break;

case ‘ł’:

znak = static_cast(136);

break;

case ‘ń’:

znak = static_cast(228);

break;

case ‘ó’:

znak = static_cast(162);

break;

case ‘ś’:

znak = static_cast(152);

break;

case ‘ź’:

znak = static_cast(171);

break;

case ‘ż’:

znak = static_cast(190);

break;

case ‘Ą’:

znak = static_cast(164);

break;

case ‘Ć’:

znak = static_cast(143);

break;

case ‘Ę’:

znak = static_cast(168);

break;

case ‘Ł’:

znak = static_cast(157);

break;

case ‘Ń’:

znak = static_cast(227);

break;

case ‘Ó’:

znak = static_cast(224);

break;

case ‘Ś’:

znak = static_cast(151);

break;

case ‘Ź’:

znak = static_cast(141);

break;

case ‘Ż’:

znak = static_cast(189);

break;

}

}

return znak;

}

//właściwy program

int main ()

{

cout PL (“Teraz się zabawimy polskimi znakami”) endl;

cout PL(“I znowu - Zażółć gęślą jaźń”) endl;

cin.get ();

cin.get();

return 0;

}

POLSKIE ZNAKI W KONSOLI W ANGIELSKIM WINDOWSIE

Wielu z was posiada anglojęzyczny Windows i pewnie napotkało problemy z wyświetlaniem polskich znaków w konsoli po kompilacji programu. Dzieje się tak dlatego że posiadacie niestety system operacyjny, który ma inny język i wyżej podane przeze mnie przykłady jak wyświetlić polskie znaki w konsoli niestety nie będą działały. By to poprawić należy zrobić następujące czynności (ten przykład został oparty na Windows 7 Premium English) .

:o :o :o :o

1. Kliknij w lewym dolnym rogu przycisk Start - Control Panel - Region and Language

2. W okienku Region and Language wybierz zakładkę Formats a w niej pod Format wybierz Polish (Poland)

3. W okienku Region and Language wybierz zakładkę Location a w niej pod Current location wybierz Poland

4. W okienku Region and Language wybierz zakładkę Keyboards and Languages i kliknij przycisk Change Keyboard a następnie pojawij się okienko Text Services and Input languages i pod Default input language wybierz Polish (Poland) - Polish Programmers, na dole z lewej strony klijkni przycisk Add i dodaj polską klawiaturę też Polish (Programmers), następnie klijkni ok.

5 W okienku Region and Language wybierz zakładkę Administrative , która jest w sumie najważniejszą tam kliknij przycick Change System locale i wybierz Polish (Poland)

6.Uruchom ponownie Windows

Teraz możesz bez przeszkód wykorzystać powyższe przykłady w Windowsie anglojęzycznym by uzyskać polskie znaki w konsoli

Zna ktoś rozwiązanie tego problemu? Implementuję w borlandzie i żadna z metod Raf20076 nie działa. Tzn druga odpada z założenia. Będę wdzięczny

tylko /230 faktycznie działa i wypisuje “ś” le nie znam reszty odpowiedników

#include using namespace std;

a ja kompiluje g++ i też działa. Jak pisałem pod Windowsem to używałem Dev’a i nie sprawiał mi żadnych problemów.

Obie wersji od Raf20076 działają tez w Borlandzie, nawet ta druga która niby odpada z założenia.

Nie działa mi pierwszy przykład w Builderze, drugi ok.

W Visual u mnie pierwszy jest ok, drugi nie.

setlocale(LC_ALL, "");

Nie działa mi w Builderze,działa w Visual.

Do d**y tamte przykłady są.

Twój kod alex działa wszędzie. :slight_smile:

Napisałem swój podobny do Twojego na "switch-ach " i też działa mi wszędzie. :slight_smile:

Ten co podałem jest bardzo szybki, na switch’ach to maaaaaaksymalnie wolny.

Nooooooo tak,ale tak czy siak user nie musi gdzieś tam w ustawieniach grzebać.

Dodane 04.07.2009 (So) 12:51

Jakby ktoś nie kumał zapisu pętli alex to pozwoliłem sobie to rozpisać odrobinę czytelniej.

while(*str)

     {

      char *pos=strchr(cp+18,*str);


      if (pos)

         *(bf) = *(pos-18);

      else

         *(bf) = *str;

      ++bf;

      ++str;

     }

Jeśli odkopałem stary temat to sorry, ale mam pytanie.

Użyłem kodu alexa i działa ale jest kłopot bo muszę pisać:

cout << tr("Małe litery: ąćęłńóśźż");

cout << tr("Duże litery: ĄĆĘŁŃÓŚŹŻ");

A nie poprostu:

std::cout << "Małe litery: ąćęłńóśźż" << std::endl;

std::cout << "Duże litery: ĄĆĘŁŃÓŚŹŻ" << std::endl;

Da się to przerobić jakoś ? A może wystarczy zrobić to poprzez “#define”, wie ktoś jak to zrobić ?

A nie wystarczy zapisać pliku źródłowego w CP852(i ew. zmusić kompilator do nie zmieniania kodowania)?

Gdy zmieniam to w visual c++ to wyskakuje taki error:

6d0897456d63.jpg

Wie ktoś co zrobić by to zadziałało prawidłowo ?