Čeština v konzole aplikaci MS VS 2015 rubrika: Programování: C/C++

8 Tomáš Tintěra
položil/-a 7.11.2015

Jak dělat česky píšící programy v console app projektu v MS VS 2015?

Příklad: http://screencast.com/t/SonIQakl

#include "stdafx.h"
#include <iostream>

using std::cout;
using std::endl;
 
int main()
{
    cout << endl << "Zapomněla vážení" << endl << endl;
}

Vypíše: Zapomnýla vß×enÝ

Příklad číslo 2 - s použitím SetConsoleOutputCP http://screencast.com/t/qwJbCfHPDms

Příklad číslo 3: nejjednodušší funkční, dle linku od uetoyo.
Bez použití dalších/externích knihoven.

#include "stdafx.h"
#include <stdexcept>
#include <stdlib.h>
#include <iostream>
#include "windows.h"

#include    <io.h>      // _setmode, _fileno
#include    <fcntl.h>   // _O_U8TEXT

 
using std::wcout;    using std::wcerr;
using std::endl; using std::wstring;      using std::string;
using std::runtime_error;
using std::exception;
 
 
bool throwX(string const& s) { throw runtime_error(s); }
bool hopefully(bool v) { return v; }
void setUtf8Mode(FILE* f, char const name[])
{
    int const newMode = _setmode(_fileno(f), _O_U8TEXT);
    hopefully(newMode != -1)
        || throwX(string() + "setmode failed for " + name);
}
 
int main()
{
    try
    {
        static wchar_t const wideText[] = L"Přespříliš žluťoučký kůň úpěl ďábelské ódy.";
        setUtf8Mode(stdout, "stdout");
        wcout << "Wide text:   " << wideText << endl;
        return EXIT_SUCCESS;
    }
    catch (exception const& x)
    {
        wcerr << "!" << x.what() << endl;
    }
    return EXIT_FAILURE;
}

Ukázka běhu: http://screencast.com/t/MIPn05kP8I

Díky všem za pomoc. C++ má opravdu řadu možností co a jak vypsat do konzole.
Ale jen výjimečně tím jde vypsat české znaky. Podobně asi i jiné neanglické.
Zřejmě je dobré používat mimo standardních i další knihovny. Viz odpovědi níže.

Komentáře

odkaz Vyřešeno
4 xexperimente
odpověděl/-a 7.11.2015
 
upravil/-a 7.11.2015

Stačí použít spravnou funkci wcout

#include "stdafx.h"
#include <iostream>
#include "windows.h"

using namespace std;
 
 
int main()
{
 
    SetConsoleOutputCP(1250);
 
    wcout << endl << "Zapomněla vážení" << endl << endl;
 
    getchar();
}

Komentáře

  • Anonym : můj výstup: ZapomnÄ›la váženĂ­ 7.11.2015
  • xexperimente : Muj je spravný - v projektu nastaveno unicode, v nastaveni console truetype font a zdrojový soubor uložený v cp1250 kódování 7.11.2015
  • Tomáš Tintěra : S přepnutím konzole do Lucida console to vážně začne fungovat. Copy paste zachová diakritiku v pořádku bez ohledu na font. Ve standardním nastavení konzole vypadal výstup v Gilberish. http://screencast.com/t/lVV2aEo47wq. (VS 2015 @ W7_CZ) 7.11.2015
  • xexperimente : Ten rasterový font v sobě některé české znaky ani neobsahuje 7.11.2015
  • Tomáš Tintěra : @uetoyo Tenhle výstup nastane při uložení zdrojáku v UTF-8 bez BOM. MS Překladač má za to, že je v ANSI 1250, pokud je na stroji, kde probíhá překlad nastavena česká locale a nenajde BOM. (V kontrastu k vývojovému prostředí, které jej zobrazí správně). Portabilním řešením jsou zdrojáky v UTF-8 s BOM. 7.11.2015
  • Tomáš Tintěra : Po ukončení programu se správně vypsalo "Pokračujte stisknutím libovolné klávesy" i když mám zapnutá rastrová písma. Takže znaky 'ě', 'á' někdy/nějak umí. 7.11.2015
  • Anonym : @xexperimente: zprovozněno -- po kontrole jsem to také rozběhl -- ach ty Windows :) 7.11.2015
  • Tomáš Tintěra : JJ, danou otázku řeší jednodušším způsobem. Nicméně tohle je cesta k profi řešení. UTF-8 na vstupu i výstupu, jak na konzoli, tak do souboru. 7.11.2015

Pro zobrazení všech 6 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.