2014-12-13 3 views
6

У меня есть следующий фрагмент кода:Странное поведение станд :: строка с юникодом

#include <iostream> 

std::string eps("ε"); 

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

Как-то компилирует с г ++ и лязгом на Ubuntu, и даже печатает правильный характер ε. Также у меня есть почти такой же фрагмент кода, который с радостью читает ε с cin в std::string. Кстати, eps.size() - 2.

Мой вопрос - как это работает? Как мы можем вставить символ Unicode в std::string? Я предполагаю, что операционная система обрабатывает всю эту работу с помощью unicode, но я не уверен.

EDIT

Как выход, я понял, что это терминал, который отвечает за показ мне правильный символ (е в данном случае).

Но с вводом: cin читает символы до ' ' или любого другого символа пробела (и, как я понимаю, byte by byte). Итак, если я беру Ƞ, второй байт 32 ' ' будет читать только первый байт, а затем остановиться. Но он читает Ƞ. Как?

+3

Возможно редактор вы используете сохраняет файл с UTF-8 кодировке. –

+0

Да, но я не понимаю, как 'std :: cout' выводит один символ вместо двух - первый и второй байты ε. Насколько я знаю, 'std :: cout' работает с однобайтовыми кодировками. – justanothercoder

+2

std :: cout просто отправляет поток на терминал. Если ваш терминал обрабатывает UTF-8, это должно работать нормально. – MrEricSir

ответ

5

Наиболее вероятной причиной является то, что все становится закодированы в UTF-8, как это делает на моей системе:

$ 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 
     ^^^^    
Смежные вопросы