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).