2014-12-13 7 views
6

Ich habe das folgende Stück Code:Seltsames Verhalten von std :: string mit Unicode

#include <iostream> 

std::string eps("ε"); 

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

Irgendwie kompiliert es mit g ++ und Klirren auf Ubuntu und druckt sogar richtigen Charakter ε aus. Auch habe ich fast das gleiche Stück Code, der glücklich ε mit cin in std::string liest. Übrigens, eps.size() ist 2.

Meine Frage ist - wie das funktioniert? Wie können wir Unicode-Zeichen in std::string einfügen? Meine Vermutung ist, dass Betriebssystem all diese Arbeit mit Unicode verarbeitet, aber ich bin mir nicht sicher.

EDIT

Wie bei Ausgabe, verstand ich, dass es Terminal ist, die für das Zeigen mir richtigen Charakters (ε in diesem Fall) verantwortlich ist.

Aber mit Eingabe: cin liest Symbole ' ' oder ein anderes Leerzeichen (und wie ich byteweise verstehe). Also, wenn ich Ƞ nehme, welches zweite Byte 32 ' ' ist, wird es nur das erste Byte lesen und dann aufhören. Aber es liest Ƞ. Wie?

+3

der Editor Sie verwenden sind speichert die Datei mit UTF-8-Kodierung Vielleicht. –

+0

Ja, aber ich verstehe nicht, wie 'std :: cout' ein Symbol anstelle von zwei ausgibt - erstes und zweites Byte von ε. Soweit ich weiß, arbeitet 'std :: cout' mit Ein-Byte-Kodierungen. – justanothercoder

+2

std :: cout sendet nur einen Stream an das Terminal. Wenn Ihr Terminal UTF-8 handhabt, sollte dies gut funktionieren. – MrEricSir

Antwort

5

Der wahrscheinlichste Grund ist, dass alles in UTF-8 codiert wird immer, wie es auf meinem System funktioniert:

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