2014-12-13 5 views
6

Ho il seguente pezzo di codice:strano comportamento di std :: string con unicode

#include <iostream> 

std::string eps("ε"); 

int main() 
{ 
    std::cout << eps << '\n'; 
    return 0; 
} 

In qualche modo si compila con g ++ e clangore su Ubuntu, e anche ne emette personaggio giusto ε. Inoltre ho quasi lo stesso pezzo di codice che legge felicemente ε con cin in std::string. A proposito, eps.size() è 2.

La mia domanda è: come funziona? Come possiamo inserire il carattere unicode in std::string? La mia ipotesi è che il sistema operativo gestisca tutto questo con unicode, ma non ne sono sicuro.

EDIT

Come con uscita, ho capito che è terminale che è responsabile per mostrare me giusto carattere (ε in questo caso).

Ma con l'input: cin legge i simboli su ' ' o qualsiasi altro carattere di spazio (e come ho capito byte per byte). Quindi, se prendo Ƞ, quale secondo byte è 32 ' ' leggerà solo il primo byte, quindi si fermerà. Ma legge Ƞ. Come?

+3

Forse l'editor che si sta utilizzando salva il file con codifica UTF-8. –

+0

Sì, ma non capisco come 'std :: cout' restituisca un simbolo anziché due - primo e secondo byte di ε. Per quanto ne so, 'std :: cout' funziona con codifiche a un byte. – justanothercoder

+2

std :: cout invia semplicemente uno stream al terminale. Se il tuo terminale gestisce UTF-8, questo dovrebbe funzionare correttamente. – MrEricSir

risposta

5

La ragione più probabile è che tutto è sempre codificato in UTF-8, come fa sul mio sistema:

$ xxd test.cpp 
... 
0000020: 2065 7073 2822 ceb5 2229 3b0a 0a69 6e74 eps("..");..int 
         ^^^^ ε in UTF-8     ^^ TWO bytes! 
... 
$ g++ -o test.out test.cpp 
$ ./test.out 
ε 
$ ./test.out | xxd 
0000000: ceb5 0a 
     ^^^^