Пишу программу, которая через указатели выводить посимвольно текст.
Код:
#include <iostream>
using namespace std;
int main()
{
void disprstr(char*);
char str[]="Что за отстой?!";
disprstr(str);
return 0;
}
void disprstr(char* str)
{
while(*str)
{
cout<<*str++<<' ';
}
cout<<endl;
}
При запуске вместо "Ч т о з а о т с т о й ? ! " она выводит "� � � � � � � � � � � � � � � � � � � � � � ? !"
А когда просто печатаешь символьный массив - нормально выводит русский текст. В чём может быть дело?
При запуске вместо "Ч т о з а о т с т о й ? ! " она выводит "� � � � � � � � � � � � � � � � � � � � � � ? !"
А когда просто печатаешь символьный массив - нормально выводит русский текст. В чём может быть дело?
Если кратко, в большинстве Linux'ов по умолчанию используется кодировка UTF-8, в которой символ кодируется 1..6 байтами. В частности, кириллица кодируется 2-мя байтами.
Однако прелесть Unicode в том, что даже если перекодировать строку так, чтобы каждый codepoint занимал фиксированно 32-битное число, один codepoint не всегда будет соответствовать одному глифу. Более того, у одного и того же глифа может быть несколько вариантов кодирования (в кириллице этим страдает "ё"). Подробности см. на http://unicode.org
И чего делать теперь? Как выводить символы по указателям?
Как всегда. Только надо понимать как происходит вывод на самом деле.
Т.е. понимать, что для компьютера таких понятий как буква, цифра и т.п. не существует в принципе. Они есть только в представлении человека.
А компьютер выполняет просто передачу последовательности байтов. А уже как эта последовательность байтов будет отображаться на экране, определяется устройством вывода.
Кстати, советую убрать вывод пробела после вывода очередного байта и посмотреть, что получится.