2014-12-13 17 views
6

Mam następujący fragment kodu:Dziwne zachowanie std :: string z unicode

#include <iostream> 

std::string eps("ε"); 

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

Jakoś kompiluje z g ++ i brzękiem na Ubuntu, a nawet drukuje się prawy charakter ε. Mam również prawie ten sam kawałek kodu, który szczęśliwie czyta ε z cin w . Przy okazji, eps.size() jest 2.

Moje pytanie brzmi - jak to działa? Jak wstawić znak Unicode do std::string? Domyślam się, że system operacyjny obsługuje całą tę pracę z unikodem, ale nie jestem pewien.

EDIT

Jak z wyjściem, zrozumiałem, że jest to końcówka, która jest odpowiedzialna za pokazanie mi prosto charakter (e w tym przypadku).

Ale z wejściem: cin czyta symbole do ' ' lub dowolnej innej spacji (i jak rozumiem bajt po bajcie). Tak więc, jeśli wezmę Ƞ, który drugi bajt jest 32 ' ' będzie czytał tylko pierwszy bajt, a następnie zatrzyma się. Ale czyta się: Ƞ. W jaki sposób?

+3

Może redaktor używasz zapisuje plik z kodowaniem UTF-8. –

+0

Tak, ale nie rozumiem, w jaki sposób 'std :: cout' wypisuje jeden symbol zamiast dwóch - pierwszy i drugi bajt ε. O ile mi wiadomo, 'std :: cout' działa z kodowaniem jednobajtowym. – justanothercoder

+2

std :: cout właśnie wysyła strumień do terminala. Jeśli twój terminal obsługuje UTF-8, powinno to działać poprawnie. – MrEricSir

Odpowiedz

5

Najbardziej prawdopodobnym powodem jest to, że wszystko jest coraz zakodowane w UTF-8, jak ma to miejsce w moim systemie:

$ 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 
     ^^^^