2013-09-07 1 views
10

Perchécout << "привет"; o wcout << L "привет";

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

funziona bene, mentre

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

non lo fa? (in Qt Creator per linux)

+1

Presumibilmente, perché qualunque cosa riceve questi caratteri come output "non capisce caratteri ampi". Se descrivi "Non funziona" un po 'di più, potrebbe essere d'aiuto. –

+0

stampa ???? invece nella finestra del terminale. Tuttavia, come "привет" può essere unicode? – user2029077

+4

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

risposta

13

GCC e Clang consente di considerare il file sorgente come UTF-8. Il tuo terminale Linux è probabilmente configurato anche su UTF-8. Quindi con cout<< "привет" c'è una stringa UTF-8 che viene stampata su un terminale UTF-8, tutto va bene.

wcout<< L"привет" dipende dalla corretta configurazione di Locale per convertire i caratteri di larghezza nella codifica dei caratteri del terminale. Le impostazioni internazionali devono essere inizializzate affinché la conversione funzioni (lo default "classic" aka "C" locale non sa come convertire i caratteri ampi). Utilizzare std::locale::global (std::locale ("")) affinché le impostazioni internazionali corrispondano alla configurazione dell'ambiente o std::locale::global (std::locale ("en_US.UTF-8")) per utilizzare un locale specifico (similar to this C example).

Ecco il sorgente completo del programma di lavoro:

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

Con g++ test.cc && ./a.out questa stampe "привет" (su Debian Jessie).

Vedere anche this answer sui pericoli dell'utilizzo di caratteri ampi con output standard.

+0

Il motivo è la conformità con gli standard C, C++ e POSIX. – AProgrammer

+0

grazie. tuttavia è sorprendente che "привет" non sia std letterale dovrebbe essere 'char []'. – user2029077

+1

@MinimusHeximus: "привет" è char [] in UTF-8 per impostazione predefinita, L "привет", tuttavia, è wchar [] in UTF-16, UTF-32 o UCS-2. – ArtemGr