2010-05-17 20 views
20

Wciąż uczę się C++, więc trzymajcie mnie i mój niechlujny kod. Używany kompilator to Dev C++. Chcę móc wyprowadzać znaki Unicode do konsoli za pomocą cout. Kiedy próbuję takich rzeczy jak:Wyjście Unicode na konsolę Przy użyciu C++, w systemie Windows

#include <iostream> 

int main() 
{ 
    std::cout << "Hello World!\n"; 
    std::cout << "Blah blah blah some gibberish unicode: ĐĄßĞĝ\n"; 
    system("PAUSE"); 
    return 0; 
} 

Wydaje dziwne znaki do konsoli, takie jak μA ■ Gg. Dlaczego to robi i jak mogę wyświetlić ĐĐßĝĝ? Czy nie jest to możliwe w systemie Windows?

+5

tylko komentarz: nie używaj systemu ("pauza"), jego bardzo zła praktyka. zamiast tego możesz użyć cin. http://www.gidnetwork.com/b-61.html – nmuntz

+0

Duplikat? http://stackoverflow.com/questions/2492077/output-unicode-strings-in-windows-console-app –

+18

O Boże, jak ludzie to robią? Jak to się stało, że każdy nowicjusz przyciąga do Dev C++? Ten śmieć był błędny 5 lat temu i zgadnij co?Nadal trwa do dzisiaj **, ponieważ od tego czasu nie jest utrzymywany **. Jest tak wiele ** dobrych ** darmowych kompilatorów i IDE. Dlaczego oh, dlaczego początkujący nalegają na wybieranie jedynego, który jest absolutnym bzdurą, brakuje podstawowych funkcji, nigdy nie pracował, i jest buggy jak diabli i jest wyposażony w prehistoryczny kompilator domyślnie? – jalf

Odpowiedz

15

Co z numerem std::wcout?

#include <iostream> 

int main() { 
    std::wcout << L"Hello World!" << std::endl; 
    return 0; 
} 

Jest to standardowy strumień wyjściowy szerokich znaków.

Nadal, jak zauważył Adrian, nie odnosi się to do faktu, że cmd, domyślnie nie obsługuje wyjść Unicode. To może być skierowana przez ręcznego konfigurowania konsoli, jak opisano w Adriana odpowiedź:

  • Zaczynając cmd z /u argumentu;
  • Wywołanie chcp 65001 w celu zmiany formatu wyjściowego;
  • Ustawienie czcionki Unicode w konsoli (np. Lucid Console Unicode).

Można również spróbować użyć _setmode(_fileno(stdout), _O_U16TEXT);, które wymagają fcntl.h i io.h (jak opisano w this answer i udokumentowane w this blog post).

+0

Nie dotyczy to faktu, że konsola działa zwykle w trybie ANSI lub OEM. –

+1

Jest to w większości poprawne, ale ... 'cmd' domyślnie obsługuje wyjście Unicode do konsoli, ale nie po przekierowaniu do pliku. Użyj '/ u', aby wyprowadzić Unicode do przekierowanych plików. W obu przypadkach "Unicode" oznacza "UTF-16" jak zwykle w Windows. 'chcp 65001' ustawia stronę kodową' ANSI' na 'UTF-8', która nie jest tworzona dla szerokich znaków,' wcout' i 'cmd/u'. Nie musisz ustawiać strony kodowej na UTF-8, aby wyprowadzać UTF16 !! Ponadto API 'WriteFile()' jest zepsute w 'chcp 65001'. Wywołanie '_setmode()' jest ważne i wymagane, jeśli chcesz wyprowadzać znaki poza twoją stronę kodową ANSI! – hippietrail

+0

@Adrian: Konsola nie ma trybu ANSI lub OEM. To on ma stronę kodową ANSI, która domyślnie jest stroną kodową OEM, taką jak 437 lub 850. Ale nie musisz drukować za pośrednictwem tej strony kodowej. Wszystkie interfejsy API tekstowe Windows mają wersję 'A' i wersję' W'. 'A' dla ANSI, który przechodzi przez stronę kodową,' W' dla "szerokiego", który nie przechodzi przez stronę kodową, lecz działa bezpośrednio w Unikodzie UTF-16. Oba są zawsze obecne bez wymogu lub nawet możliwości przełączenia "trybu". – hippietrail

1

Użyłeś strumienia wyjściowego ANSI. Trzeba użyć
std::wcout << L"Blah blah blah some gibberish unicode: ĐĄßĞĝ\n";

także skorzystać std :: cin.get(), a nie system ("PAUSE")

+1

Dzięki za podpowiedź na temat cin.get(). Wiem, że używam systemu ("PAUSE"); jest złym nawykiem, ale program Dev C++ nie obsługiwał niczego innego, z czego korzystałem. Ponadto, program nie jest rozpoznawany przez program Dev C++. Myślę, że postąpię zgodnie z poradami w innych odpowiedziach/komentarzach i przejdę do Visual Studio. Mam mniej problemów z tym IDE. –

+0

Należy również zauważyć, że 'system (" PAUSE ")' nie jest przenośny, podczas gdy 'cin.get()' jest. – ptyyy

6

Nie jestem pewien, Windows XP będzie w pełni popieram to, co trzeba. Są trzy rzeczy, które musisz zrobić, aby włączyć Unicode z konsolą poleceń:

  1. Uruchom okno poleceń przy pomocy cmd /u. /u mówi, że twoje programy wyprowadzą kod Unicode.
  2. Użyj chcp 65001, aby wskazać, że chcesz używać UTF-8 zamiast jednej ze stron kodowych.
  3. Wybierz czcionkę z większym zasięgiem glifu. Okna poleceń w nowszych wersjach systemu Windows oferują Lucida Console Unicode. Moje pole XP ma podzbiór o nazwie Lucida Console. Nie ma bardzo rozległego repertuaru, ale powinno wystarczyć, jeśli próbujesz wyświetlić akcentowane postacie.
+1

+1 do użytku chcp 65001 - to wystarczy. (od cmd /?:/U Powoduje, że wyjście poleceń wewnętrznych do potoku lub pliku ma postać Unicode.) –

+2

1. '/ u' oznacza tylko, że wbudowane polecenia wyprowadzą kodowanie UTF-16, gdy zostanie przekierowany zamiast ANSI. To nic nie znaczy dla twojego własnego kodu lub dla wyjścia, które nie jest przekierowane. 2. 'chcp 65001' nie działa poprawnie z wyjściem konsoli UTF-8 z powodu błędu w API' WriteFile() ', który powoduje, że zwraca on niewłaściwą wartość. Ten interfejs API jest wywoływany przez standardowe funkcje biblioteki C, takie jak 'printf()', a każdy z nich, który sprawdza kod powrotu, może zawieść lub spowodować nieprzewidywalne zachowanie. 3. Porada dotycząca czcionek jest prawidłowa i jest głupim niepowodzeniem systemu Windows IMHO. – hippietrail

-3

W Linuksie, mogę naiwnie zrobić:

std::cout << "ΐ , Α, Β, Γ, Δ, ,Θ , Λ, Ξ, ... ±, ... etc"; 

i pracował dla większości znaków próbowałem.

Powiązane problemy