Purpursarkans
@Purpursarkans
мамкин хакер

Как записать кириллический символ в char?

Есть код:
#include <iostream>
using namespace std;
int main()
{
    char a[] = "sыs";
    char qwe1_eu = 'c';
    char qwe2_ru = 'с';
    cout << a << endl;
    cout << a[0] << endl;
    cout << a[1] << endl;
    cout << a[2] << endl;
    cout << a[3] << endl;
    cout << endl << qwe1_eu << endl;
    cout << endl << qwe2_ru << endl;
}


при компиляции возникают два предупреждения:
5d3f04af6f875671357358.png

и при запуске такой вывод:
5d3f0511ef3e5032870717.png

Первая строчка выводится нормально,
вторая - это cout a[0],
третья и четвертая строчки - это должен быть один символ 'ы', но он разбился на a[1] и a[2], то же самое с седьмой и девятой строчкой, два визуально одинаковых символа, 'с', но на разных языках, латинский выводится нормально, кириллический разбивается на два символа и выводится вопрос (то есть, ошибка кодировки).

Почему такое происходит и можно ли как-то это вылечить?
И если нельзя, то какую альтернативу использовать для записи и проверки русских символов по одной штуке?
  • Вопрос задан
  • 5251 просмотр
Решения вопроса 1
@whiteBlackness
В char записать русский символ ты можешь только в восьмибитной кодировке, например в https://ru.wikipedia.org/wiki/Windows-1251

У тебя тут скорее всего utf-8, а в нём один символ может занимать несколько байт.
А в char влезает только один байт.
Проверку русского символа можешь реализовать например, с помочью передачи указателя на позицию символа в строке. А дальше по таблице проверить первый символ (D0 или D1) , и следующий.
i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
reverse_kacejot
@reverse_kacejot
Junior C++ Developer, bachelor of Applied Math
Тут два выхода:
  1. использовать wchar_t вместо char.
  2. выставить локаль через std::setlocale.


Учитывая, что это Arch, ты мог не сгенерить русскую локаль при установке: https://wiki.archlinux.org/index.php/Installation_...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы