Web-Developer
-
Автор темы
- #1
это не сработает#include <cwchar>
#include <locale>
std::setlocale(LC_ALL, "");
ну как тебе вывод сделать надоэто не сработает
Тут дело не в выводе, это софт для игры.ну как тебе вывод сделать надо
Вариант юзать английский - не подходитТут дело не в выводе, это софт для игры.
Я пытаюсь получить цвет роли игрока, я вписываю роль игрока и беру первый символ этой роли - дальше прогоняю через switch case и если первый символ совпадает с кейсом выдаю роли цвет - затем рисую в imgui, но цвет же не удается получить - т.к проблемы с кириллицей, если ставить в case английские буквы - все ок, русские - проблема.
вот я хз че делать ;(по сутиsetlocale(LC_ALL, "Russian");
но хз ведь в C++ нет прямой поддержки русских символов в блоке Switch-Case
думаешь сработает?Пожалуйста, авторизуйтесь для просмотра ссылки.
нужно пробоватьдумаешь сработает?
Гений, не поддерживается у него... Ну да-ну да, у нас же кресты под одну кодировку делали... А "L" - это пранк от разрабов какой-то.по сутиsetlocale(LC_ALL, "Russian");
но хз ведь в C++ нет прямой поддержки русских символов в блоке Switch-Case
Как сделать так чтобы в Switch-Case поддерживались еще и русские символы?
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;
}
switch(ch)
{
case u8'Д': return
...
}
Что блин? u8 по определению для одного символа кириллицы будет описываться несколькими байтами, как ты будешь сравнивать это с интегральным типом в свитче?1) Используй u8 литерал вместо литерала L. Не нужно делать никаких кастов внутри функции
Стоить понимать 3 разных кодировки (их гораздо больше, но нам нужно для понимания только 3).Switch-Case поддерживались еще и русские символы?
Мне казалось, что так можно делатьЧто блин? u8 по определению для одного символа кириллицы будет описываться несколькими байтами, как ты будешь сравнивать это с интегральным типом в свитче?
Можем в дс списаться?Что блин? 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).
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz