Polskie znaki w konsoli Windows

0

Jak zmienić kodowanie edytora VS 2019, żeby zgadzało się z konsolą OEM852?

Nie mogę tego znaleźć w ustawieniach nigdzie.

W kodzie próbowałem tego i nic nie pomogło:

  1. std::cout.imbue(std::locale("Polish_poland.852"));
    std::cout << "ĄĘŁÓąężźłóśŚŻŹ\n";
  2. setlocale(LC_CTYPE, "");
    std::cout << "ąęćśńół";
  3. std::cout.imbue(std::locale("Polish"));
  4. setlocale(LC_ALL, "");
0

Pierwszy punkt będzie działał, jeśli tekst będziesz wypisywał w znakach szerokich strumieniem std::wcout.

0

Ad1) locale nie używają takich nazw! powinno być pl_PL.852 pl-PL.852 (chodź nie jestem pewien co do końcówki .852. Najlepiej używać pustego napisu, bo wtedy użyte zostanie ustawienie systemowe.
Ad2) setlocale to jest API C i ma wpływ tylko na API C (nie ma wypływu na std::cin std::cout).
Ad3) Jak 1
Ad4) Jak 2

Na Windows działa to kiepsko (czyli nie działa) i nie tylko ty masz z tym problem: https://stackoverflow.com/a/4497266/1387438
Zgodnie z odpowiedzią na SO radziłbym spróbować z boost::locale.

Na moim Win10 z MSVC 2017 taki kod:

#include <Windows.h>
#include <iostream>

int main()
{
    using namespace std;

    EnumSystemLocalesEx([](LPWSTR pStr, DWORD dwFlags, LPARAM lparam){
        std:wcout << pStr << L'\n';
        return TRUE;
    }, LOCALE_ALL, NULL, NULL);
    return 0;
}

Po przefiltrowaniu mycode.exe | find "pl":
daje:

pl
pl-PL

Czyli standardy sobie, MS sobie.

0

Aby z Visual Studio zapisać plik z kodowaniem OEM852 wybierasz "Save as" , klikasz trójkącik przy "Save", wybierasz "Save with Encoding", Na liście "Encoding" znajdujesz "Central European (DOS) - Codepage 852".

Jednak tak naprawdę, to nie o to Ci chodzi.

Dla prawidłowego wyprowadzania na konsolę ważne jest ustawienie czcionki (nie może być rastrowa, musi być TT np. Courier New, Lucida Console).

W programie najprostszym rozwiązaniem (chociaż nie do końca eleganckim) jest zmiana strony kodowej konsoli SetConsoleCP lub SetConsoleOutputCP.

Bardziej skomplikowane rozwiązania używają SetConsoleMode do detekcji przekierunkowania do pliku i jeśli nie ma przekierunkowania konwertują jeśli trzeba tekst na UTF16 (MultiByteToUnicode albo std::mbtowc) i na konsolę wysyłają tekst za pomocą WriteConsoleW. W tym przypadku strona kodowa konsoli nie ma znaczenia.

0
-daniel- napisał(a):

Aby z Visual Studio zapisać plik z kodowaniem OEM852 wybierasz "Save as" , klikasz trójkącik przy "Save", wybierasz "Save with Encoding", Na liście "Encoding" znajdujesz "Central European (DOS) - Codepage 852".

Jednak tak naprawdę, to nie o to Ci chodzi.

Jednak zapisanie pliku jako CP852 jest najłatwiejsze, nie trzeba za dużo kombinować…

0
-daniel- napisał(a):

Nigdy nie testowałem tej możliwości. W wielu przypadkach używam WriteConsoleW.

Właśnie sprawdziłem pod VS2019. Zapis i kompilacja pliku w CP852 działa prawidłowo. Ale przy otwarciu pliku IDE zakłada z automatu CP1250, trzeba ręcznie wybierać kodowanie (i pamiętać o tym za każdym razem...)

setlocale(LC_CTYPE, ".852") przyda się by funkcje z biblioteki standardowej prawidłowo rozpoznawały znaki (to NIE wpływa na wyjście, a na działanie rzeczy jak isalpha()).

Jest też taki sposób:

	_setmode(_fileno(stdout), _O_U16TEXT); // albo _O_U8TEXT
	wcout << L"żółć" << endl;
	wprintf(L"żółć\n");

Nie trzeba się męczyć z WriteConsoleW. Ale to totalnie psuje zwykłego couta i printfa, więc trzeba uważać (_O_TEXT żeby odkręcić).
No i stdin osobno.

Tak czy inaczej, jakikolwiek sposób z Unicode'em wymaga by w konsoli była wybrana czcionka unikodowa (np. Lucida Console). Jeśli jest wybrana "czcionka rastrowa", to zadziała tylko sposób z CP852.

Więcej informacji:
http://archives.miloush.net/michkap/archive/2008/03/18/8306597.html

Użytkownik może mieć ustawioną inną stronę np. po użyciu chcp.

To już użytkownika problem. Nie przejmowałbym się tym przypadkiem.

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