C++ Вопрос Как использовать кириллицу в wchar_t?

Web-Developer
Начинающий
Статус
Оффлайн
Регистрация
18 Авг 2019
Сообщения
123
Реакции[?]
12
Поинты[?]
1K
1702044969473.png
Есть такая проблема, что русские символы не могут провериться из-за того что не поддерживается кириллица, что делать в этом случае?
Как сделать так чтобы в Switch-Case поддерживались еще и русские символы?
 
Web-Developer
Начинающий
Статус
Оффлайн
Регистрация
18 Авг 2019
Сообщения
123
Реакции[?]
12
Поинты[?]
1K
ну как тебе вывод сделать надо
Тут дело не в выводе, это софт для игры.
Я пытаюсь получить цвет роли игрока, я вписываю роль игрока и беру первый символ этой роли - дальше прогоняю через switch case и если первый символ совпадает с кейсом выдаю роли цвет - затем рисую в imgui, но цвет же не удается получить - т.к проблемы с кириллицей, если ставить в case английские буквы - все ок, русские - проблема.
Тут дело не в выводе, это софт для игры.
Я пытаюсь получить цвет роли игрока, я вписываю роль игрока и беру первый символ этой роли - дальше прогоняю через switch case и если первый символ совпадает с кейсом выдаю роли цвет - затем рисую в imgui, но цвет же не удается получить - т.к проблемы с кириллицей, если ставить в case английские буквы - все ок, русские - проблема.
Вариант юзать английский - не подходит
 
SummerLOVE
Пользователь
Статус
Онлайн
Регистрация
26 Авг 2022
Сообщения
346
Реакции[?]
51
Поинты[?]
9K
по сути setlocale(LC_ALL, "Russian"); но хз ведь в C++ нет прямой поддержки русских символов в блоке Switch-Case
 
Web-Developer
Начинающий
Статус
Оффлайн
Регистрация
18 Авг 2019
Сообщения
123
Реакции[?]
12
Поинты[?]
1K
IRQL_APC_LEVEL
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2018
Сообщения
211
Реакции[?]
88
Поинты[?]
3K
по сути setlocale(LC_ALL, "Russian"); но хз ведь в C++ нет прямой поддержки русских символов в блоке Switch-Case
Гений, не поддерживается у него... Ну да-ну да, у нас же кресты под одну кодировку делали... А "L" - это пранк от разрабов какой-то.

У ТС-а в функцию передается аргументом const char*, а он пытаеся из этого UTF-16le символ получить. Иными словами, из одного байта пытается вытянуть два, из мухи слона и тд. Ясное дело, что ничего работать не будет.
 
Последнее редактирование:
Stop Staring At the Shadows
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
519
Реакции[?]
497
Поинты[?]
86K
Как сделать так чтобы в Switch-Case поддерживались еще и русские символы?
C++:
int wide_char_dispatcher(const wchar_t* wc)
{
    switch (wc[0])
    {
    case L'С':
        return 1;
    case L'Т':
        return 2;
    case L'Р':
        return 3;
    case L'О':
        return 4;
    case L'К':
        return 5;
    case L'А':
        return 6;
    }

    return 0;
}


int main()
{
    std::cout << wide_char_dispatcher(L"СТР") << '\n';

    return 0;
}
?
1702051004941.png
 
Участник
Статус
Оффлайн
Регистрация
5 Окт 2017
Сообщения
782
Реакции[?]
173
Поинты[?]
11K
Используй u8 литерал вместо литерала L. Не нужно делать никаких кастов внутри функции

C++:
switch(ch)
{
   case u8'Д': return
   ...
}
 
Последнее редактирование:
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
1) Используй u8 литерал вместо литерала L. Не нужно делать никаких кастов внутри функции
Что блин? u8 по определению для одного символа кириллицы будет описываться несколькими байтами, как ты будешь сравнивать это с интегральным типом в свитче?
Switch-Case поддерживались еще и русские символы?
Стоить понимать 3 разных кодировки (их гораздо больше, но нам нужно для понимания только 3).
ansi: для этого тип char, оно описывает символы ascii таблицы, каждый символ занимает 1 байт, там не поддерживается русский язык напрямую, только латиница, цифры и спецзнаки, а так же символы какого-то одного языка в ограниченом режиме (зависит от текущей кодировки).
unicode/utf16: для этого тип wchar_t, символ уже занимает 2 байта, и позволяет описать любой символ из любого стандартного языка (ну почти) одновременно.
utf8: это вариант когда ты описываешь utf16 но один символ у тебя может занимать один или несколько байт, чем часто-используемый символ, тем меньшим количеством байт он записывается.
У тебя строка в const char*, т.е. каждый символ у тебя там занимает 1 байт.
Возможно это utf-8 если скажем ты читаешь это где-то из игры, что тоже кодируется байтами.
Когда ты кастуешь char к wchar_t, то ему неоткуда взять информацию для конвертации, если там ansi то так кастовать можно только для латиницы, цифр, спецзнаков, но никак не для русских символов, если же там utf8, то ты берешь только первый байт символа (а русские кодируются минимум тремя в utf8), и опять неправильная конвертация.
Твою roleString надо сконвертировать в юникод строку (const wchar_t*) и только тогда брать из нее первый wchar_t символ.
Либо декодировать первый utf8 символ из roleString, и чекнуть его (он будет как раз utf16).
 
Участник
Статус
Оффлайн
Регистрация
5 Окт 2017
Сообщения
782
Реакции[?]
173
Поинты[?]
11K
Что блин? u8 по определению для одного символа кириллицы будет описываться несколькими байтами, как ты будешь сравнивать это с интегральным типом в свитче?
Мне казалось, что так можно делать
 
Последнее редактирование:
Web-Developer
Начинающий
Статус
Оффлайн
Регистрация
18 Авг 2019
Сообщения
123
Реакции[?]
12
Поинты[?]
1K
Что блин? u8 по определению для одного символа кириллицы будет описываться несколькими байтами, как ты будешь сравнивать это с интегральным типом в свитче?

Стоить понимать 3 разных кодировки (их гораздо больше, но нам нужно для понимания только 3).
ansi: для этого тип char, оно описывает символы ascii таблицы, каждый символ занимает 1 байт, там не поддерживается русский язык напрямую, только латиница, цифры и спецзнаки, а так же символы какого-то одного языка в ограниченом режиме (зависит от текущей кодировки).
unicode/utf16: для этого тип wchar_t, символ уже занимает 2 байта, и позволяет описать любой символ из любого стандартного языка (ну почти) одновременно.
utf8: это вариант когда ты описываешь utf16 но один символ у тебя может занимать один или несколько байт, чем часто-используемый символ, тем меньшим количеством байт он записывается.
У тебя строка в const char*, т.е. каждый символ у тебя там занимает 1 байт.
Возможно это utf-8 если скажем ты читаешь это где-то из игры, что тоже кодируется байтами.
Когда ты кастуешь char к wchar_t, то ему неоткуда взять информацию для конвертации, если там ansi то так кастовать можно только для латиницы, цифр, спецзнаков, но никак не для русских символов, если же там utf8, то ты берешь только первый байт символа (а русские кодируются минимум тремя в utf8), и опять неправильная конвертация.
Твою roleString надо сконвертировать в юникод строку (const wchar_t*) и только тогда брать из нее первый wchar_t символ.
Либо декодировать первый utf8 символ из roleString, и чекнуть его (он будет как раз utf16).
Можем в дс списаться?
 
Сверху Снизу