2013-09-07 21 views
10

Dlaczegocout << "привет"; lub wcout << L "привет";

cout<< "привет"; 

działa dobrze while

wcout<< L"привет"; 

nie? (w Qt Creator dla systemu Linux)

+1

Prawdopodobnie, ponieważ cokolwiek otrzymuje te znaki jako wynik "nie rozumie szerokich znaków". Jeśli opisujesz "Nie działa" trochę więcej, może ci to pomóc. –

+0

to drukuje ???? zamiast tego w oknie terminala. Jak jednak "привет" może być unicode? – user2029077

+4

и тебе "привет" – vladkras

Odpowiedz

13

Domyślnie GCC i Clang traktują plik źródłowy jako UTF-8. Twój terminal Linux jest prawdopodobnie również skonfigurowany do UTF-8. Tak więc z cout<< "привет" jest ciąg znaków UTF-8, który jest wydrukowany w terminalu UTF-8, wszystko jest dobrze.

wcout<< L"привет" zależy od prawidłowej konfiguracji Locale w celu konwersji szerokich znaków w kodowanie znaków terminala. Aby proces konwersji zadziałał, należy zainicjować ustawienia regionalne (default "classic" aka "C" locale nie wie, jak konwertować szerokie znaki). Użyj opcji std::locale::global (std::locale ("")), aby Ustawienia regionalne były zgodne z konfiguracją środowiska lub std::locale::global (std::locale ("en_US.UTF-8")), aby używać określonego ustawienia narodowego (similar to this C example).

Oto pełna źródłowy programu roboczego:

#include <iostream> 
#include <locale> 
using namespace std; 
int main() { 
    std::locale::global (std::locale ("en_US.UTF-8")); 
    wcout << L"привет\n"; 
} 

Z g++ test.cc && ./a.out ten drukuje "Ďđčâĺň" (na Debianie Jessie).

Zobacz także this answer o zagrożeniach związanych z używaniem szerokich znaków ze standardowym wyjściem.

+0

Powodem jest zgodność ze standardami C, C++ i POSIX. – AProgrammer

+0

dzięki. jednak zaskakujące jest to, że "привет" nie jest std dosłowny, to powinno być 'char []'. – user2029077

+1

@MinimusHeximus: "привет" jest char [] w UTF-8 domyślnie, L "привет", jednak jest wchar [] w UTF-16, UTF-32 lub UCS-2. – ArtemGr