Страницы

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

вторник, 12 февраля 2019 г.

Русская строка в C

Как получается что русские символы умещаются в C строке в кодировке UTF-8 когда каждый русский символ в этой кодировке занимает 2 байта, а ячейка в C строке вмещает только 1 байт? Почему если выводить эту строку, то она выведется без проблем, а если выводить её посимвольно, то она выводит ошибки? Ещё если можно, то посоветуйте материалов почитать по этой теме.
char a[] = "Строка"; std::cout << a << std::endl; for (int i = 0; i < 6; i++) std::cout << a[i] << std::endl;


Ответ

Чудес не бывает - символы, занимающие больше одного байта в Си так же занимают больше одного байта. В случае со строкой char они лежат в нескольких ячейках (в случае с двухбайтными - первый символ лежит в первых двух, второй - во вторых двух).
Если говорить о C++, то для многобайтных символов есть специальный тип wchar_t, который имеет размер в 4 байта для GNU/Linux и 2 байта для Windows API
Аналогом std::string для этого типа является std::wstring
http://en.cppreference.com/w/cpp/string/basic_string

// сперва считаем символ беззнаковым, потом переводим его в целое число char a[] = "Строка"; std::cout << (int)(unsigned char)a[0] << "; " << (int)(unsigned char)a[1] << std::endl;
Выведет 208; 161 (https://ideone.com/FyUdhj)
Согласно вот это (https://unicode-table.com/ru/0421/) таблице, символ С в UTF-8 представляется двумя байтами, как раз 208 161

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

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