Не могу привести кириллицу к верхнему регистру

Пытался привести кириллицу к верхнему регистру используя wchar_t. Для этого был написан следующий код:

int main(int argc, char *argv[]){
    setlocale(LC_ALL, "rus");

    wchar_t strr[] = L"Привет";
    for(int i = 0; strr[i] != '\0'; ++i)
        strr[i] = towupper(strr[i]);
        
    wcout << strr << endl;
    return 0;
}

На выходе получаю следующее: Privet

Хотя ожидается, что слово будет приведено к верхнему регистру. Работаю из Ubuntu 20.04 и сперва думал, что проблема из-за отсутствия русской локали, однако после установки таковой ничего не изменилось.


Ответы (1 шт):

Автор решения: KoVadim

Я сделал буквально одно маленькое изменение и все работает

int main(int argc, char *argv[]){
    std::setlocale(LC_ALL, "uk_UA.utf8");
    wchar_t strr[] = L"Привет";
    for(int i = 0; strr[i] != '\0'; ++i)
        strr[i] = std::towupper(strr[i]);

    std::wcout << strr << std::endl;
    return 0;
}

с указанием std::setlocale(LC_ALL, "ru_RU.utf8"); у меня не работает нормально. Потом вернул setlocale(LC_ALL,"uk_UA.utf8"); (заметьте, что setlocale и std::setlocale - это могут быть две разные функции!!!) и все равно все работает. А с "rus" - никак.

Но потом я посмотрел в вывод locale -a и понял, что нет у меня этой локали. Поэтому, добавляем локаль, проверяем, что она есть, а потом, код заработает.

Добавляем локали

sudo locale-gen ru_RU
sudo locale-gen ru_RU.UTF-8
sudo update-locale 
→ Ссылка