Как перевести русские буквы в нижний регистр?

Весь вопрос в заголовке. Пользуюсь Linux.

if (c >= 'а' && c <= 'п')
    c += 'А' - 'а';
else if (c >= 'р' && c <= 'я')
    c += 'Р' - 'р';
else if (c == 'ё')
    c = 'Ё';

Сейчас заметила, не работает просто

char ch = 'г';
std::cout<<ch<<std::endl;

Попробовала с w_char

w_char ch = 'г';
std::wcout<<ch<<std::endl;

Выводит иероглиф. В интернете есть решение с литералом L. Но его нельзя поставить перед переменной.


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

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

Не английские слова лучше всего обрабатывать через библиотеку ICU. Нашел примеры https://www.delftstack.com/howto/cpp/how-to-convert-string-to-uppercase-cpp/

Несколько способов оттуда. Upper заменить на lower и должно работать.

std

#include <iostream>
#include <algorithm>
#include <string>

using std::cout; using std::string;
using std::endl; using std::cin;
using std::transform; using std::toupper;

string capitalizeString(string s)
{
    transform(s.begin(), s.end(), s.begin(),
                   [](unsigned char c){ return toupper(c); });
    return s;
}

int main() {
    string string1("hello there είναι απλά ένα κείμενο χωρίς");
    cout << "input  string: " << string1 << endl
         <<  "output string: " << capitalizeString(string1) << endl << endl;

    return 0;
}

ICU

Компилить с линковкой на icu

g++ sample_code.cpp -licuio -licuuc -o sample_code

Пример

#include <iostream>
#include <string>
#include <unicode/unistr.h>
#include <unicode/ustream.h>
#include <unicode/locid.h>

using std::cout; using std::string;
using std::endl; using std::cin;
using std::transform; using std::toupper;

int main() {
    string string1("hello there είναι απλά ένα κείμενο χωρίς");

    icu::UnicodeString unicodeString(string1.c_str());
    cout << "input string:  " << string1 << endl
        <<  "output string: " << unicodeString.toUpper() << endl;

    return 0;
}

Пример кода из вопроса подойдет для 8-битных кодировок вроде cp1251, cp866, koi-8. Для utf надо отбрасывать префиксы алфавитов

→ Ссылка
Автор решения: AlexGlebe

Ставим локаль. Используем тип буквы wchar_t и потоки только wcin ,wcout. Считываем букву и уменьшаем её размер.

# include <locale>
# include <iostream>
int main(){
    setlocale(LC_ALL,"ru_RU.UTF-8");
    wchar_t c ;
    std::wcin>>c;
    std::wcout<<L"Вход = "<<c<<std::endl;
    
    c=towlower(c);

  std::wcout<<L"Выход = "<<c<<std::endl;
    
}

Г
Вход = Г
Выход = г
→ Ссылка