Problem w CodeBlocksie z system("chcp 1250");

0

Witam. Jestem w trakcie czytania ksiazki Bjarne Stroustrup'a "Programowanie i praktyka w c++ wydanie 3" , autor na potrzeby ksiazki stworzyl kod zrodlowy do biblioteki ktora zawiera w sobie kilka roznych innych bibliotek . Biblioteka nazywa sie std_lib_facilities.h. Link do strony do kodu zrodlowego : https://www.stroustrup.com/Programming/std_lib_facilities.h . Autor w ksiazce napisal ze jesli zamiast znakow (ćśę) będą w konsoli wyświetlały sie "krzaki" trzeba w mainie wpisac funkcje system("chcp 1250"); i to powinno rozwiazac problem , lecz u mnie po uruchomieniu projektu w konsoli wyskakuje napis : " 'chcp' is not recognized as an internat or external command , opperable program or batch file . Prosiłbym o pomoc w rozwiazaniu problemu . Dodam rowniez ze prawidlowo stworzylem plik headerowy z tym kodem zrodlowym autora ksiazki i umiescilem go w folderze z kompilatorem. Pozdrawiam :)

1

polecenie system() służy do wywołania komend systemu operacyjnego lub innego programu dostępnego w systemie operacyjnym, np. dla windows system(dir /p); dla unix/linux system(ls -a);
Jeżeli możesz podać stronę gdzie autor tak napisał "system("chcp 1250");" to bardzo Cię o to proszę, sprawdzę to

Jeżeli chodzi o polską czcionkę w konsoli to zajrzyj i przeczytaj poniższe linki:
https://cpp0x.pl/forum/temat/?id=282
https://cpp0x.pl/forum/temat/?id=14148
https://cpp0x.pl/forum/temat/?id=26191

0

Sam przypis znajduje sie na samym dole na stronie 69 . Przesylam zdjecie : 20220115_183102.jpg

0

Mam książkę wystarczyło podać tylko numer strony
Sprawdziłem na Windows XP u mnie działa.
Po uruchomieniu konsoli zmieniłem czcionkę na "Lucida Console" i pojawiła się polska czcionka

https://stackoverflow.com/questions/8142058/chcp-is-not-recognized-as-an-internal-or-external-command-operable-program-or
http://illegalargumentexception.blogspot.com/2009/04/i18n-unicode-at-windows-command-prompt.html#charsets_1252

0

Ja pracuje wlasnie na systemie operacyjnym windows 8.1 Jest szansa ze to u mnie zadziala ?
Po dodaniu biblioteki windows.h problem nadal wystepuje ..

0
Sonwest napisał(a):

Jest szansa ze to u mnie zadziala ?

Tak, o ile wykonasz oba kroki.

0

Jesli któryś z forumowiczów byłby w stanie pomoc mi rozwiazac ten problem to bylbym wdzieczny :)

5

Kiedyś na SO popełniłem taką odpowiedź: https://stackoverflow.com/a/67819605/1387438

Tłumaczenie na nasze:

Wszystko się rozchodzi o kodowanie znaków i czy dane kodowanie wspiera potrzebne znaki.

Twój może używać kodowania UTF-8 a konsola innego kodowania, ale musisz poinformować standardową bibliotekę jakie kodowanie ma być używane w danym kontekście.
Oczywiście każde kodowanie po drodze misi wspierać potrzebne znaki, żeby wynik końcowy był zgodny z oczekiwaniami.

Niestety są aż pięć miejsc, gdzie kodowanie znaków musi zostać poprawnie skonfigurowane, żeby wszystko działało jak należy.

  • Kod źródłowy. VisualStudio domyślnie używa kodowania znaków zgodnego z ustawieniami systemowym. To jest problem jak się pracuje w międzynarodowym zespole. Najlepiej jest zmusić VS (oraz wszystkie edytory używane do kodu) do używania uniwersalnego kodowania znaków, wybór UTF-8 jest najlepszy.
  • następnie trzeba zadbać, by kompilator, wiedział jakiego kodowania używasz w kodzie źródłowym. Dla msvc jest to opcja cl /source-charset:utf-8 .....
  • Kodowanie znaków w pliku wykonalnym (binarce). Należy wybrać jakiego kodowania ma użyć kompilator, do reprezentacji literałów napisów. Dla msvc to opcja: cl .... /execution-charset:utf-8 .....
  • Następnie w momencie, gdy twoja aplikacja uruchamia się musisz poinformować standardową bibliotekę jak są kodowane znaki w twoim programie (binarce). Po prostu standardowa biblioteka, nie jest budowania przez ciebie, więc nie zawiera tej informacji. Gdzieś w swoim kodzie, musisz ustawić globalne locale z informacją o kodowaniu znaków.
std::locale::global(std::locale{".utf-8"});
  • na koniec należy skonfigurować wyjściowy/wejściowy strumień danych jakiego kodowania znaków używa konsola. Do tego celu należy ustawić locale na std::cout i std::cin zgodnie z bieżącymi ustawieniami systemowymi:
    auto streamLocale = std::locale{""}; 
    // this impacts date/time/floating point formats, so you may want tweak it just to use sepecyfic encoding and use C-loclae for formating
    std::cout.imbue(streamLocale);
    std::cin.imbue(streamLocale);

Jeśli wszystkie te punkty powyżej są poprawnie skonfigurowane to wszytko powinno działać bez problemów, bez potrzeby pisania kodu, który będzie jawnie wykonywał konwersję znaków.
Ilość miejsc gdzie można coś skopać jest spora, więc ludzie mają problem z ogarnięciem tematu, a internet jest pełen kulawych rozwiązań.

Poniżej masz program, którego można użyć do testowania i zobaczenia, że to co opisałem ma ręce i nogi:

#include <iostream>
#include <locale>
#include <exception>
#include <string>

void setupLocale(int argc, const char *argv[])
{
    std::locale def{""};
    std::locale::global(argc > 1 ? std::locale{argv[1]} : def);
    auto streamLocale = argc > 2 ? std::locale{argv[2]} : def;
    std::cout.imbue(streamLocale);
    std::cin.imbue(streamLocale);
}

void printSeparator()
{
    std::cout << "---------\n";
}

void printTestStuff()
{
    std::cout << "Wester Europe: āāāčččēēēēßÞÖöñÅÃ\n";
    std::cout << "Central Europe: ąĄÓóŁłĘężćźŰűÝýĂă\n";
    std::cout << "China: 字集碼是把字符集中的字符编码为指定集合中某一对象\n";
    std::cout << "Korean: 줄여서 인코딩은 사용자가 입력한\n";
}

int main(int argc, const char *argv[]) {
    try{
        setupLocale(argc, argv);
        printSeparator();
        printTestStuff();
        printSeparator();
    }
    catch(const std::exception& e)
    {
        std::cerr << e.what() << '\n';
    }
}

W celu przetestowania skompilowałem i uruchomiłem ten program w kosoli dweloperskiej w następujący sposób (copy - paste).
Zwróć uwagę, że przykład poniżej pokrywa sytuację gdzie kodowanie w jednym z kroków jest nieprawidłowe:

C:\Users\User\Downloads>cl /source-charset:utf-8 /execution-charset:utf-8 /EHsc encodings.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29336 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

encodings.cpp
Microsoft (R) Incremental Linker Version 14.28.29336.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:encodings.exe
encodings.obj

C:\Users\User\Downloads>chcp
Active code page: 437

C:\Users\User\Downloads>encodings.exe
---------
Wester Europe: Ä?Ä?Ä?Ä?Ä?Ä?Ä"Ä"Ä"Ä"AYAzA-AA±A.Aƒ
Central Europe: Ä.Ä,A"A3Å?Å,Ä~ÄTżÄ╪źŰűA?A½Ä,ă
China: å--é>+碼æ~_æSSå--ç¬▌é>+ä,-çs,å--ç¬▌ç¼-ç ?ä,ºæO╪årsé>+å?^ä,-æY?ä,?å_1象
Korean: ì,ì-¬ì,o ì?,ì½"ë"cì?? ì,¬ìscìz?ê°? ìz.ë ¥ío
---------

C:\Users\User\Downloads>encodings.exe .65001
---------
Wester Europe: aaaccceeeeß_ÖöñÅA
Central Europe: aAOóLlEezczUuYyAa
China: ????????????????????????
Korean: ??? ???? ???? ???
---------

C:\Users\User\Downloads>encodings.exe .65001 .437
---------
Wester Europe: aaaccceeeeß_ÖöñÅA
Central Europe: aAOóLlEezczUuYyAa
China: ????????????????????????
Korean: ??? ???? ???? ???
---------

C:\Users\User\Downloads>encodings.exe .65001 .1250
---------
Wester Europe: aaaccceeeeß_ÖöñÅA
Central Europe: aAOóLlEezczUuYyAa
China: ????????????????????????
Korean: ??? ???? ???? ???
---------

C:\Users\User\Downloads>chcp 1250
Active code page: 1250

C:\Users\User\Downloads>encodings.exe .65001 .1250
---------
Wester Europe: aaačččeeeeß?ÖönAA
Central Europe: ąĄÓóŁłĘężćźŰűÝýĂă
China: ????????????????????????
Korean: ??? ???? ???? ???
---------

C:\Users\User\Downloads>chcp 65001
Active code page: 65001

C:\Users\User\Downloads>encodings.exe
---------
Wester Europe: ÄÄÄÄÄÄēēēēßÞÖöñÅÃ
Central Europe: ąĄÓóÅłĘężćźŰűÃýĂă
China: 字集碼是把字符集中的字符编ç 为指定集åˆä¸­æŸä¸€å¯¹è±¡
Korean: 줄여서 ì¸ì½”ë”©ì€ ì‚¬ìš©ìžê°€ ìž…ë ¥í•œ
---------

C:\Users\User\Downloads>encodings.exe .65001
---------
Wester Europe: āāāčččēēēēßÞÖöñÅÃ
Central Europe: ąĄÓóŁłĘężćźŰűÝýĂă
China: 字集碼是把字符集中的字符编码为指定集合中某一对象
Korean: 줄여서 인코딩은 사용자가 입력한
---------

C:\Users\User\Downloads>encodings.exe .65001 .65001
---------
Wester Europe: āāāčččēēēēßÞÖöñÅÃ
Central Europe: ąĄÓóŁłĘężćźŰűÝýĂă
China: 字集碼是把字符集中的字符编码为指定集合中某一对象
Korean: 줄여서 인코딩은 사용자가 입력한
---------

C:\Users\User\Downloads>

komenda chcp ziania konfigurację konsoli cmd.exe i domyślne ustawienia systemowe widziane przez programy.
https://en.wikipedia.org/wiki/Windows_code_page

437 - strona kodowa OEM-US
1250 - strona kodowa Windows-1250 pokrywa między innymi Polskie znaki i jest domyślnym ustawieniami, na Windows z polską konfiguracją językową.
65001 - strona kodowa UTF-8

2

A jeszcze zapomniałem o paru rzeczach;

Na mojej konsoli Windows znaki chińskie i koreańskie w wypadku prawidłowym wyświetlał się jako kwadraty.
To nie był efekt błędnego kodowania, ale tego, że font ustawiony dla konsoli nie zawierał znaków dla tych języków.
Najlepiej to widać po skopiowaniu wyniki z konsoli do innego programu (przeglądarki), wtedy znaki wyświetlają sie prawidłowo (kwadraty przybierają właściwą formę), dla prawidłowej konfiguracji, więc to co widać wyżej jest dokładne copy-paste (usunąłem tylko dane osobowe).

Jeśli nic się nie zrobi, używa tylko polskich znaków, system ma ustawioną stronę kodową 1250, to wszystko może wydawać się działać dobrze, ponieważ.
Visual Studio zapiszę źródła w Windows-1250 (z ustawień systemowych).
Kompilator użyje ustawień systemowych, więc dobrze odczyta źródła i zapisze program używając tego samego kodowania.
Program nie będzie zmieniał ustawień locale, więc napisy będą używane w postaci surowej, a te są w kodowaniu zgodnym z systemowymi, więc na bieżącym komputerze będzie działać.
Jednak wystarczy przenieś plik wykonalny na inny komputer z inną konfigurację (albo zmienić konfigurację) i taki program wypiszę krzaki, a taki z zgodny z opisem wyżej, będzie próbował utrzymać sensowną zwartość znaków (np usunie ogonki i akcenty).

3
Sonwest skomentował(a):

Długo nad tym ślęczałem ale wkoncu sie udalo mi to naprawic. Mam teraz mega satysfkacje . Wielkie dzieki za pomoc ;) Mam teraz jeszcze takie ostatnie pytanko... Jak wlaczam projekt konsolowy w code blocksie to po uzyciu tej funkcji system("chcp 1250") ; w okienku konsolowym pojawia sie komunikat Active code page : 1250 . Da sie zrobic tak zeby tego komunikatu nie bylo?

Może z mojego opisu to nie wynika, ale w kodzie nie powinieneś mieć: system("chcp 1250"). Nie powinieneś zmieniać ustawień systemowych użytkownikowi, bez jego prośby/przyzwolenia.

Nie używam CodeBlocks, ale upewnij się, że

  • zapisuje on kod w pożądanym kodowaniu (preferowane UTF-8)
  • że kompilator (najprawdopodobniej gcc) uzywa tego kodowania do odczytu pliku
  • że kompilator generuje kod w pożądanym kodowaniu
  • a do kodu dodaj to (niech main wywoła na początku):
void setupEncoding()
{
     std::locale::global(std::locale{".<wybrane kodowanie znaków w programie>"});
     auto streamLocale = std::locale{""}; 
     std::cout.imbue(streamLocale);
     std::cin.imbue(streamLocale);
}

W ten sposób aplikacja będzie działać wszędzie.

0

@MarekR22: Super . Na potrzeby ksiazki bede poki co wedle zaleceń autora używał tej biblioteki "std_lib_facilities.h" z funkcja system("chcp 1250"); . Lecz jestem swiadom ze na pewno w przyszlosci lepiej bedzie uzywac tego sposobu co mi tutaj podales , zreszta jutro go tez przetestuje :) . Mysle ze temacik zostal wyczerpany a co do tego komunikatu o ktorym wspomnialem po uzyciu funkcji system("chcp 1250"); jakies rady jak zrobic zeby sie nie pojawiał?

2

Skoro się upierasz:

system("chcp 1250  > nul");

0 użytkowników online, w tym zalogowanych: 0, gości: 0