К сожалению, OP не описал ОС и терминал, в котором он пытался, но я думаю, что знаю, что случилось, и осмелюсь написать ответ.
Я описываю это для первой буквы H
.(Это случается и со всеми остальными.)
for ( i=0; i<str.length(); ++i)
{
cout << str[i];
}
Это просто: std::ostream& operator <<(std::ostream&, char)
используется и просто печатает H
.
for ( i=0; i<str.length(); ++i)
{
cout << (int) str[i] << " ";
}
Символы (тип char
) преобразуются в int
.(Преобразование выполняется первым, поскольку его приоритет выше, чем у operator<<()
.) Следовательно, используется std::ostream& operator <<(std::ostream&, int)
.Поскольку манипуляторы ввода-вывода не активны, он просто печатает 72
- десятичное значение кода ASCII H
.(В C ++ 'H'
(char
константа) и 72 (int
константа) являются просто двумя видами для выражения значения 72.)
for ( i=0; i<str.length(); ++i)
{
encode[i] = (str[i] << 1) ;
cout << encode[i] << " ";
}
Вот что происходит в третьем цикле:
str[i]
обеспечивает char
. operator<<()
повышает char
до int
, поскольку 1
является константой int
. -
operator<<()
(в своем первоначальном значении «сдвиг влево в битах») эффективно умножает значение str[i]
на 2, т.е. H
(== 72) становится 144. - Результатом являетсяпреобразуется (зажимается) в
char
при присвоении encode[i]
. - Значение
encode[i]
печатается с использованием std::ostream& operator <<(std::ostream&, char)
(как в первом цикле).
Сейчасвсе становится туманным, так как я не знаю, где отображается вывод (и как).(Следовательно, мои первоначальные жалобы по поводу отсутствия ОС и тому подобного.)
Тем не менее, я видел похожие результаты при работе в xterm
без поддержки UTF-8.
144 может быть непечатным символомв консоли вывода.(Стандарт ASCII описывает только символы со значениями 0 ... 127 и первые 32, а также последние являются управляющими символами.) В этом случае код символа просто печатается в виде восьмеричной последовательности (такой же, как принятыйв строковых литералах C / C ++).
Калькулятор Windows: Декабрь 144 Окт Вывод 220
.
Yepp,Это соответствует \220
, описанному в OP.
Подумав дважды, я вспомнил, что в UTF-8 никогда не бывает одиночных байтов со значением> = 128.Кодовые точки выше 127 всегда кодируются как минимум с двумя значениями> 128. Следовательно, этот вывод может / должен происходить в терминале с поддержкой UTF-8, а также просто не формирует действительные последовательности UTF-8.
Из любопытства я скомпилировал и протестировал программу OP на coliru и получил:
Hello World
72 101 108 108 111 32 87 111 114 108 100
� � � � � @ � � � � �
Live Demo на coliru
* �
- это, вероятно, заполнители для символов, представляющих недопустимые последовательности UTF-8.Чтобы проверить это, я сделал пример счетчика:
#include <iostream>
int main()
{
std::cout << "\xc3\x9c\n";
return 0;
}
, где "\xc3\x9c"
предоставляет кодированную последовательность UTF-8 для Ü
.
Выход:
Ü
Демонстрация в реальном времени на coliru