Co do komunikatu. Zapewne w pliku źródłowym zawarte są znaki, których nie ma w domyślnym kodowaniu ANSI, np. cyrylica w polskim kodowaniu Window-1250. Generalnie pliki źródłowe powinny być zapisywane w utf-8.
Co do krzaków: w Windowsie sprawa jest zagmatwana, bo konsola ze względów historycznych używa kodowania OEM, system - kodowania ANSI, chociaż tak na prawdę jest w pełni unikodowy.
W skrócie (dla wersji PL):
- konsola: CP852
- system: Windows-1250
Kompilując program wszystkie literały mają kodowanie takie, jak plik źródłowy, który je zawiera. Jeśli plik jest unikodowy - zamieniane są na kodowanie ANSI (1250). Jak łatwo się domyśleć, podawanie konsoli, która oczekuje kodowania OEM, znaków w kodowaniu ANSI skończy się niepoprawnym wyświetlaniem napisów.
Jednym z rozwiązań jest wymuszenie na kompilatorze użycia kodowania OEM. W MinGW można to zrobić parametrem -fexec-charset=cp852. Ważne, by zapisać pliki źródłowe w utf-8 z BOM-em. Minusem tego rozwiązania jest to, że wszystkie pliki tekstowe stworzone w systemie najprawdopodobniej będą w kodowaniu ANSI. Musisz o tym pamiętać.
Inne rozwiązanie to pisanie aplikacji w unikodzie z użyciem znaków szerokich i unikodowych odpowiedników strumieni - std::wcin, std::wcout, std::wifstream itd.