Dlaczego na Windowsie można w C++ napisać chcp 1250, by działały polskie znaczki?

0

Kod z innego wątku:

int main()
{
    system("chcp 1250");
    double val1;
    double val2;
 
    while (cin >> val1 >> val2)
    {
        if (val1 == val2)
            cout << "Liczby są równe." << endl;
        else if (val1 > val2) {
            cout << "Mniejsza z liczb to: " << val2 << "\nWiększa z liczb to: " << val1 << endl;
            if (val1 - val2 < 1.0 / 100) cout << "Liczby są prawie równe." << endl;
        }
        else {
            cout << "Mniejsza z liczb to: " << val1 << "\nWiększa z liczb to: " << val2 << endl;
            if (val2 - val1 < 1.0 / 100) cout << "Liczby są prawie równe." << endl;
        }
    }
 
    return 0;
}

Zakładam, że to działa (nie sprawdzałem).

Ale dlaczego?

Z tego, co mi wiadomo, (może się mylę), defaultowo w C++ stringi od wersji bodajże 11 przechowywane są w UTF-8, chyba że się wywoła jakieś tam funkcje biblioteki standardowej, które to zmieniają. W związku z tym na Linuxie można bez żadnych ceregieli napisać program w C++ wypisujący na stdout polskie znaczki i będzie działać; ale ponieważ cmd.exe ani nawet PowerShell defaultowo UTF-8 nie obsługują, to ten sam program będzie wypisywał na WIndowsie krzaczki. Czy to, co napisałem w tym akapicie, jest błędne?

Albowiem tutaj widzę program, który najpierw przestawia kodowanie znaków kosnoli Windowsa na Windows-1250, a potem (w moim rozumieniu) wypisuje na tę konsolę UTF-8?!

2

Z tego, co mi wiadomo, (może się mylę), defaultowo w C++ stringi od wersji bodajże 11 przechowywane są w UTF-8

Nie. Jest to zależne od systemu. UTF-8 jest domyślnym kodowaniem od jakiegoś czasu w Linuksie (nie zawsze było).

W związku z tym na Linuxie można bez żadnych ceregieli napisać program w C++ wypisujący na stdout polskie znaczki i będzie działać; ale ponieważ cmd.exe ani nawet PowerShell defaultowo UTF-8 nie obsługują, to ten sam program będzie wypisywał na WIndowsie krzaczki.

Jeśli będzie wypisywał w UTF-8 to będą rzeczywiście krzaczki.

Albowiem tutaj widzę program, który najpierw przestawia kodowanie znaków kosnoli Windowsa na Windows-1250, a potem (w moim rozumieniu) wypisuje na tę konsolę UTF-8?!

Nie; ustawia na 1250 i wypisuje w 1250. Żeby sztuczka z chcp zadziałała, sam plik źródłowy musi być zakodowany w CP1250.

Konsola w polskim Windowsie ma domyślnie kodowanie CP852. Jeśli program będzie wyświetlał w tym kodowaniu (co się sprowadza do tego że plik źródłowy będzie w 852) to nie trzeba niczego ustawiać.

Windows wewnętrznie operuje na UTF-16. Od strony C++ obsługuje się to kodowanie typem znakowym wchar_t i klasą wstring.
UTF-8 nie jest bezpośrednio obsługiwany.

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