Страницы

Поиск по вопросам

среда, 19 декабря 2018 г.

C++ - некорректное определение отдельного символа в строке

Всем привет! Проблема заключается в следующем - имеются Linux с Code:Blocks IDE и g++ в качестве компилятора, программный код C++, а так же символьная строка (string либо char []), которой присваивается текст в кириллических символах. При выводе всей строки, выводимый текст в консоли отображается нормально. Но если обращаться к любому отдельному элементу строки, то вместо символа выводится вопросительный знак на фоне ромба и я так понимаю, что сама программа не может определить - какой это символ, так как условный оператор на него не реагирует. Кодировка естественно - Unicode (UTF-8).
#include #include
using namespace std;
int main () { string word = "Слово"; cout << word; //нормально выводится "Слово" cout << word [0]; //выводится '?' if (word [0] == "С") cout << word [0]; //оператор if считает, что false return 0; }
UPD: в общем и целом мне не нужна была большая программа, поэтому я просто создал отдельную строку, к которой присваивается необходимая пара элементов проверяемой строки содержащая один нужный символ ([0], [1]; [2], [3] и тд). Полученную строку вполне удаётся использовать в условных операторах:
#include #include
using namespace std;
int main () { string word = "Слово", letter; letter += word [0]; letter += word [1]; if (letter == "С") cout << letter;//true, выводится "С" return 0; }
Разумеется, это выглядит топорно, но на мой взгляд это самый простой способ в контексте, скажем например, университетской лабораторной работы. Спасибо всем за помощь и полезную информацию (=


Ответ

Кодировка UTF-8 это многобайтовая кодировка, один символ может кодироваться несколькими байтами.
В частности русские буквы кодируются двумя байтами, например 'ы' кодируется как "\xd1\x8b".
Когда Вы пытаетесь напечатать один байт закодированной буквы, например "\xd1" или "\x8b", то выводится как знак вопроса, потому что это не валидная UTF-8 строка.

Комментариев нет:

Отправить комментарий